Početak›Forumi›Linuks›Programiranje›BASH: kako iskopirati fajlove u svim poddirektorijumima u jedan direktorijum?
- This topic has 20 odgovora, 7 glasova, and was last updated 15 years, 10 months ranije by Marel.
-
AutorČlanci
-
1. maj 2008. u 6:45 pm #69588foxbunnyUčesnik
Hm, evo ovako:
$ find $PWD -name ‘*.pdf’ -exec cp {} /home/blackfox/shares/ebooks/ ;
find: missing argument to `-exec’$ find $PWD -name ‘*.pdf’ -exec cp {} /home/blackfox/shares/ebooks/;
find: missing argument to `-exec’Sta sam sad propustio?
1. maj 2008. u 7:11 pm #69589foxbunnyUčesnikSto bi reko narod “mamicu mu njegovu”. A lepo pise u dokumentaciji “READ THE F’CKING EXAMPLES SECTION, YOU F’CKING MORON!”
U svakom slucaju,
find $PWD -name ‘*.pdf’ -exec cp ‘{}’ /home/blackfox/shares/ebooks/ ;
Bez tih jednostrukih navodnika nije hteo da radi.
2. maj 2008. u 3:33 pm #69590soxxxUčesnikMislim da si u predhodnom postu u prvom primeru zaboravio kosu crtu ispred tacke i zareza; a u drugom primeru nisi ostavio prazno polje izmedju kose crte i tacke i zareza. Kod mene javlja drugu gresku ali je moguce da se greske razlikuju.
[font=Courier]-print[/font] izlistava fajlove i odvaja ih praznim poljem kada se izlaz prosledjuje drugoj komandi i ovo moze da predstavlja problem.
Ako imas dosta fajlova prednost je da se koristi [font=Courier]xargs[/font] zato sto ne pokrece (forkuje) poseban proces za svaki fajl kao sto to radi [font=Courier]-exec[/font], kao sto je RiSK rekao. Medjutim [font=Courier]xargs[/font] se ne snalazi bas najbolje ponekad sa fajlovima koji imaju prazno polje u imenu. Onda moze da se koristi “[font=Courier]find . -print0 | xargs0 komanda[/font]”.
Jos jedno (POSIX) resenje za ovaj problem sa praznim poljima u imenima fajlova je “[font=Courier]-exec +[/font]”. Pogledaj man stranice. 😉 Evo ti jedan tutorijal za find (pogledaj i onaj link koji ti je RiSK ostavio):http://www.hccfl.edu/pollock/Unix/FindCmd.htm
Pozdrav
2. maj 2008. u 8:15 pm #69591foxbunnyUčesnikMislim da si u predhodnom postu u prvom primeru zaboravio kosu crtu ispred tacke i zareza; a u drugom primeru nisi ostavio prazno polje izmedju kose crte i tacke i zareza. Kod mene javlja drugu gresku ali je moguce da se greske razlikuju.
Pa probao ja sve to, ali poenta je izgleda bila u tim jednostrukim navodnicima. To sam tek kasnije video iz primera da mora.
[font=Courier]-print[/font] izlistava fajlove i odvaja ih praznim poljem kada se izlaz prosledjuje drugoj komandi i ovo moze da predstavlja problem.
Ma znam, ali ostale print varijante su mi vec ono. print0 je u okvrisu skripta proizvodio identican rezulat, a ono sa formatiranjem… Hm, lakse mi da iskodiram u Pythonu sve to. 😉
Ako imas dosta fajlova prednost je da se koristi [font=Courier]xargs[/font] zato sto ne pokrece (forkuje) poseban proces za svaki fajl kao sto to radi [font=Courier]-exec[/font], kao sto je RiSK rekao. Medjutim [font=Courier]xargs[/font] se ne snalazi bas najbolje ponekad sa fajlovima koji imaju prazno polje u imenu. Onda moze da se koristi “[font=Courier]find . -print0 | xargs0 komanda[/font]”.
Jos jedno (POSIX) resenje za ovaj problem sa praznim poljima u imenima fajlova je “[font=Courier]-exec +[/font]”. Pogledaj man stranice. 😉 Evo ti jedan tutorijal za find (pogledaj i onaj link koji ti je RiSK ostavio):[u]http://www.hccfl.edu/pollock/Unix/FindCmd.htm[/u]
Pozdrav
Hvala za linkove i tebi i RiSKu. Naravno, prostudiracu ih zajedno sa man stranicama. Tek kad krene ovako da se petlja, covek shvati kolika je faca onaj link sto napravi Total Commander. 😀
3. maj 2008. u 9:29 am #69592Časlav IlićUčesnikPored toga što ne pokreće novi proces za svaki argument (osim ako baš hoćemo), meni je obrazac [tt]find … | xargs …[/tt] zgodniji od [tt]find … -exec[/tt] i po tome što mogu dodatno da filtriram ono što find nađe. Na primer, ako tvom slučaju dodam da hoću da izbacim datoteke koje sadrže [tt].svn/[/tt] u imenu:
[code]$ find odredisni/dir/ -type f -print0 | grep -Zz -v ‘.svn/’ | xargs -0 cp -t ciljni/dir/[/code]
(opcija [tt]-t[/tt] uz cp obrće redosled argumenata, tj. [tt]cp -t ciljni/dir/ datoteke[/tt] — mogu da se opkladim uvedeno baš radi xargs 🙂3. maj 2008. u 9:33 am #69593foxbunnyUčesnikfind ima podrsku za regexp, tako da ne moras ni da grepujes. 😉
3. maj 2008. u 10:01 am #69594Časlav IlićUčesnikJest, al’ su njegovi regizovi ružniji od grepovih (posebno [tt]grep -E[/tt], tj. egrep), u ovom primeru bi bilo nešto kao [tt]! -regex ‘.*.svn/.*'[/tt]. Drugo, možda i ne želim da grepujem pre obrade, već nešto peto (npr. sortiram, ili čak grepujem po sadržaju, [tt]grep -liI[/tt]). Treće, možda mi je za krajnju naredbu baš i neophodno da se pozove sa svim pronađenim datotekama, a ne samo radi brzine. Kad se sve sabere, prosto se ne hvatam za te „napredne“ mogućnosti find, a vidim da i inače ljudi to ne čine po skriptama.
(Doduše, pročitao sam negde da [tt]find … -exec[/tt] može biti korisno u slučajevima kada je bitna bezbednost, da se ništa ne umeša u cevku.)
3. maj 2008. u 11:44 am #69595foxbunnyUčesnikPa naravno, to je poenta Unix shella, uvek mozes da pajpujes. To jest, ako ne mozes, onda ta komanda i nije Unixicna. 😉
Ali ono, find je dovoljno mocan da moze i sam da ti zavrsi 99% stvari koje si naveo. 😀
A sto se tice bezbednosti, preporucuju -execdir.
16. maj 2008. u 7:40 pm #69596MarelUčesnikDa li može nekako da se izvede ovako nešto:
[code]
for file in `find . -type f`; do
# radimo nešto sa promenjljivom $file
done
[/code]Pošto for koristi space kao separator, svi fajlovi koji sadrže ovaj znak u svom nazivu će se tretirati kao dva.
Najbolje rešenje koje sam smislio je da se napravi fajl “../skript”:
[code]
read file
while [ “$file” ]; do
# radimo nešto sa promenjljivom $file
read file
done
[/code]pa da se pozove sa
[code]
find . -type f | sh ../skript
[/code]16. maj 2008. u 8:17 pm #69597Časlav IlićUčesnikMožeš to da spakuješ u zaglavlje petlje:
[code]find . -type f | while read file; do
# radimo nešto sa promenjljivom “$file”, al’ uvek pod navodnicima
done[/code] -
AutorČlanci
Moraš biti prijavljen da bi postavio komentar u ovoj temi.