Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: toti84 в Mar 24, 2009, 09:20



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

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


Титла: Re: Малко помощ за bash
Публикувано от: foxb в Mar 24, 2009, 09:43
От

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

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


Титла: Re: Малко помощ за bash
Публикувано от: toti84 в 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


Титла: Re: Малко помощ за bash
Публикувано от: shoshon в Mar 24, 2009, 10:52
Защо стреляме по зайци с галбица?

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

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

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


Титла: Re: Малко помощ за bash
Публикувано от: neter в 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 до нужната папка. В противен случай е възможно да стане голям сакатлък ;)


Титла: Re: Малко помощ за bash
Публикувано от: radoulov в 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' ...



Титла: Re: Малко помощ за bash
Публикувано от: radoulov в 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. $


Титла: Re: Малко помощ за bash
Публикувано от: gizi_ в Mar 24, 2009, 12:18
Тъй като си мисля, че се пробвате да си мерите....знанията реши и аз да се запиша в конкурса:
Код:
find . -maxdepth 1 -name "*.txt" | sed -e 's/^/\"/' -e 's/$/\"/' | xargs rm

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

Лек ден на всички  ;D !


Титла: Re: Малко помощ за bash
Публикувано от: radoulov в Mar 24, 2009, 12:43
Тъй като си мисля, че се пробвате да си мерите....знанията  [...]

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


Титла: Re: Малко помощ за bash
Публикувано от: Hapkoc в Mar 24, 2009, 12:45
Код:
find . -name '*.txt' -print0 | xargs -0 rm


Титла: Re: Малко помощ за bash
Публикувано от: mikis в 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.


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

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


Титла: Re: Малко помощ за bash
Публикувано от: toti84 в Mar 24, 2009, 17:11
Благодаря на всчки
спрях се на този ред:

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

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


Титла: Re: Малко помощ за bash
Публикувано от: mikis в Mar 25, 2009, 00:34
И защо трябва да използваш две програми (find и xargs), след като find (Solaris, BSD и GNU) поддържа/емулира вътрешно xargs с оператора +?
Това, което си дал не го видях, а откровено казано не го и знаех ;)
Просто отдавна ползвам горния метод основно да правя чексуми на файлове пръснати из директориите и затова ми се струваше най-елегантния метод :)


Титла: Re: Малко помощ за bash
Публикувано от: fleimyr в 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 ..


Титла: Re: Малко помощ за bash
Публикувано от: fleimyr в Mar 25, 2009, 15:16
Здравейте,
целта ми е да изтрия всички файлове с разширение .txt и използвам следния ред:
Код:
rm `find /root/proba/ -name "*.txt"`
който работи при едно условие, че в името на файла не трябва да има интервал.

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

в името на педантизма в условието трябва да се добави че и с поне TAB не работи ;-)

Код:
$touch "a`printf '\t'`b"
$ls
a?b
$ls -l `find . -type f`
ls: cannot access ./a: No such file or directory
ls: cannot access b: No such file or directory
$ls -l .
total 0
-rw-r--r-- 1 fleimyr fleimyr 0 2009-03-25 15:12 a?b



Титла: Re: Малко помощ за bash
Публикувано от: radoulov в Mar 25, 2009, 15:48
[...]
Код:
$touch "a`printf '\t'`b"

В този случай можеш дори да използваш ANSI strings, ако твоята shell ги поддържа:

Код
GeSHi (Bash):
  1. touch a$'\t'b