Автор Тема: Малко помощ за bash  (Прочетена 2237 пъти)

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Малко помощ за bash
« -: Mar 24, 2009, 09:20 »
Здравейте,
целта ми е да изтрия всички файлове с разширение .txt и използвам следния ред:
Код:
rm `find /root/proba/ -name "*.txt"`
който работи при едно условие, че в името на файла не трябва да има интервал.

И въпроса ми е какво трябва да се барне, че да сработи напълно ...
Активен

foxb

  • Напреднали
  • *****
  • Публикации: 175
    • Профил
    • WWW
Re: Малко помощ за bash
« Отговор #1 -: Mar 24, 2009, 09:43 »
От

http://blog.hbcom.info/archives/4

find /root/proba/ -name "*.txt"| xargs /bin/rm

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Re: Малко помощ за bash
« Отговор #2 -: Mar 24, 2009, 10:14 »
От

http://blog.hbcom.info/archives/4

find /root/proba/ -name "*.txt"| xargs /bin/rm
Не се получава
Код
GeSHi (Bash):
  1. find /root/proba/ -name "*.txt"| xargs /bin/rm
  2. /bin/rm: cannot remove `/root/proba/new': No such file or directory
  3. /bin/rm: cannot remove `/root/proba/file.txt': No such file or directory
  4. ls /root/proba/
  5. dsfds.csv  new file.txt
Активен

shoshon

  • Гост
Re: Малко помощ за bash
« Отговор #3 -: Mar 24, 2009, 10:52 »
Защо стреляме по зайци с галбица?

Код:
cd [директория] // мерси за поправката от neter
rm -R --interactive=none *.txt
!!! забалежка от radoulov - Ще се изтрият и подиректорийте ако в тях няма повече файлове. В долния пример няма да се получи този нежелан ефект.

-R за рекурсивност, а другото да не те пита на всеки файл

Все пак от вашия подход личи,че имате някакъв колосален замисъл с вероятен епичен край.
За това е то ти по сложна команда:
Код:
find /["голяма" директория] | grep [маркер или рег. израз] | rm --interactive=none
П.П ся като се замисля за критиката дето я отпрах :) май да седна да почета преди да давам ъкъл, щото явно и на прости задачи има какво да оплеска човек :) със здраве
« Последна редакция: Mar 24, 2009, 12:57 от shoshon »
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Малко помощ за bash
« Отговор #4 -: Mar 24, 2009, 11:41 »
Да дам и аз два примера :) Да се разглеждат отделно
Код
GeSHi (Bash):
  1. find /пълен/път/на/папката | grep .txt | while read i; do rm "$i" 2>/dev/null; done
  2. tree -f -i /пълен/път/на/папката | grep .txt | while read i; do rm "$i" 2>/dev/null; done

shoshon, забравил си да споменеш, че преди изпълнението на първия ти пример, трябва първо да се изпълни cd до нужната папка. В противен случай е възможно да стане голям сакатлък ;)
« Последна редакция: Mar 24, 2009, 11:58 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Малко помощ за bash
« Отговор #5 -: Mar 24, 2009, 12:04 »
С bash4:

Код
GeSHi (Bash):
  1. shopt -s globstar nullglob
  2. rm -- **/*.txt

Ако искаш да включиш и dotfiles прибави dotglob.

С която и да е shell и find, който поддържа опцията +:

Код
GeSHi (Bash):
  1. find -name '*.txt' -exec rm {} +

Ако искаш да не включваш dotfiles:

Код
GeSHi (Bash):
  1. find ! -name '.?*' -name '*.txt' ...

Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Малко помощ за bash
« Отговор #6 -: Mar 24, 2009, 12:14 »
Защо стреляме по зайци с галбица?

Код:
rm -R --interactive=none *.txt 

-R за рекурсивност, а другото да не те пита на всеки файл

[...]

От man rm | less -p'^ *-r':
Цитат
       -r, -R, --recursive
              remove directories and their contents recursively

... т.е., не е това, което toti84 иска.

Това е с bash4, иначе трябва да използваш find:

Код
GeSHi (Bash):
  1. $ printf '%s\n' **/*.txt
  2. 1.txt
  3. dir1/2.txt
  4. dir1/.3.txt
  5. dir1/dir2/4.txt
  6. $ rm -R *.txt
  7. $ printf '%s\n' **/*.txt
  8. dir1/2.txt
  9. dir1/.3.txt
  10. dir1/dir2/4.txt
  11. $ rm -- **/*.txt
  12. $ printf '%s\n' **/*.txt
  13.  
  14. $
« Последна редакция: Mar 24, 2009, 12:17 от radoulov »
Активен

gizi_

  • Напреднали
  • *****
  • Публикации: 521
  • Distribution: Debian/Lenny, SLES/9-11
  • Window Manager: Gnome 2.22.3
    • Профил
Re: Малко помощ за bash
« Отговор #7 -: Mar 24, 2009, 12:18 »
Тъй като си мисля, че се пробвате да си мерите....знанията реши и аз да се запиша в конкурса:
Код:
find . -maxdepth 1 -name "*.txt" | sed -e 's/^/\"/' -e 's/$/\"/' | xargs rm

като с този код чрез -maxdepth може да се ограничи до коя под директория трябва да се изтрият файловете. А "." ни показва да търсим в директорията в която се намираме както вместо нея може да ползваме и /път/до/директорията .

Лек ден на всички  ;D !
« Последна редакция: Mar 24, 2009, 12:21 от gizi_ »
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Малко помощ за bash
« Отговор #8 -: Mar 24, 2009, 12:43 »
Тъй като си мисля, че се пробвате да си мерите....знанията  [...]

Не си мерим знанията, ами се опитваме да дадем правилно решение ...
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Re: Малко помощ за bash
« Отговор #9 -: Mar 24, 2009, 12:45 »
Код:
find . -name '*.txt' -print0 | xargs -0 rm
Активен

mikis

  • Напреднали
  • *****
  • Публикации: 746
  • Distribution: Debian Testing
  • Window Manager: KDE
    • Профил
Re: Малко помощ за bash
« Отговор #10 -: Mar 24, 2009, 14:39 »
Код:
find . -name '*.txt' -print0 | xargs -0 rm
Ей това е най-елегантното решение, таман мислех да го напиша. Другите са малко "за Перник през Бургас"  ;)
Ето и какво казва 'man find' за тая опция:
Цитат
-print0
   True; print the full file name on the standard output, followed  by  a  null
   character  (instead of the newline character that -print uses).  This allows
   file names that contain newlines or other types of white space  to  be  cor-
   rectly  interpreted  by  programs that process the find output.  This option
   corresponds to the -0 option of xargs.
« Последна редакция: Mar 24, 2009, 14:41 от mikis »
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Малко помощ за bash
« Отговор #11 -: Mar 24, 2009, 16:13 »
Код:
find . -name '*.txt' -print0 | xargs -0 rm
Ей това е най-елегантното решение, таман мислех да го напиша. Другите са малко "за Перник през Бургас"  ;)

И защо трябва да използваш две програми (find и xargs), след като find (Solaris, BSD и GNU) поддържа/емулира вътрешно xargs с оператора +?
Активен

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Re: Малко помощ за bash
« Отговор #12 -: Mar 24, 2009, 17:11 »
Благодаря на всчки
спрях се на този ред:

Код
GeSHi (Bash):
  1. find -name '*.txt' -exec rm {} +

най-много ми радва окото.
Активен

mikis

  • Напреднали
  • *****
  • Публикации: 746
  • Distribution: Debian Testing
  • Window Manager: KDE
    • Профил
Re: Малко помощ за bash
« Отговор #13 -: Mar 25, 2009, 00:34 »
И защо трябва да използваш две програми (find и xargs), след като find (Solaris, BSD и GNU) поддържа/емулира вътрешно xargs с оператора +?
Това, което си дал не го видях, а откровено казано не го и знаех ;)
Просто отдавна ползвам горния метод основно да правя чексуми на файлове пръснати из директориите и затова ми се струваше най-елегантния метод :)
Активен

fleimyr

  • Участници
  • ***
  • Публикации: 5
    • Профил
Re: Малко помощ за bash
« Отговор #14 -: Mar 25, 2009, 14:43 »
решенията с `` и xargs са леко криви.

Код:
$pwd
/home/fleimyr/tests
$touch \ -l\ ..
$ls `find . -type f`
./:
total 0
-rw-r--r-- 1 fleimyr fleimyr 0 2009-03-25 14:30  -l ..

..:
total 4
drwxr-xr-x 2 fleimyr fleimyr 4096 2009-03-25 14:30 tests


$find . -type f | xargs ls
./:
total 0
-rw-r--r-- 1 fleimyr fleimyr 0 2009-03-25 14:30  -l ..

..:
total 4
drwxr-xr-x 2 fleimyr fleimyr 4096 2009-03-25 14:30 tests
$ls -- .
 -l ..
« Последна редакция: Mar 25, 2009, 14:53 от fleimyr »
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 9940 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 5502 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 4205 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 4359 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 4982 Последна публикация May 21, 2006, 17:20
от Pulear