BASH: kako iskopirati fajlove u svim poddirektorijumima u jedan direktorijum?
Dobrodošli, Gost. Molim vas prijavite se ili se registrujte.
Da li ste izgubili vaš aktivacioni e-mail?

Prijavite se sa korisničkim imenom, lozinkom i dužinom sesije

Linuxo Forumi

Stranice: [1] 2   Idi dole
  Štampaj  
Autor Tema: BASH: kako iskopirati fajlove u svim poddirektorijumima u jedan direktorijum?  (Pročitano 3609 puta)
0 članova i 1 posetilac pregledaju ovu temu.
foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« poslato: 01 Мај 2008, 17:19:56 »

Recimo, imam fajlove:

$PWD/zivotinje/maca
$PWD/zivotinje/kuca
$PWD/zivotinje/zirafa
$PWD/zivotinje/sibirski\ haski
$PWD/stvari/solja
$PWD/stvari/kasica

I sad, hocu sve te stvari da iskopiram u folder

/neki/tamo/folder

Ja probao ovo:

for i in $(find $PWD ! -type d -print | sed 's/ /\\ /g')
do
    cp $i /neki/tamo/folder
done

Medjutim, kad to uradim, onda mi "$PWD/zivotinje/sibirski\ haski" tretira kao "$PWD/zivotinje/sibirski\" i "haski" i onda se buni kako ti falovi ne postoje.

Da li neko zna kako da resim ovaj problem?
Prijavi uredniku   Sačuvana

milosk
Hero Member
*****
Van mreže Van mreže

Poruke: 1338


« Odgovor #1 poslato: 01 Мај 2008, 17:32:43 »

Hehe, ovo se zove zakucavanje ekserčića pneumatskim čekićem  Cheesy

Probaj samo cp -R, ili još bolje -a
Prijavi uredniku   Sačuvana

Владимир
Sr. Member
****
Van mreže Van mreže

Pol: Muškarac
Poruke: 330



« Odgovor #2 poslato: 01 Мај 2008, 17:56:41 »

@milosk
Hmm, koliko ja vidim on hoće sve fajlove i samo fajlove, da kopira u isti direktorijum.
Prijavi uredniku   Sačuvana
milosk
Hero Member
*****
Van mreže Van mreže

Poruke: 1338


« Odgovor #3 poslato: 01 Мај 2008, 18:08:13 »

@Владимир
U pravu si kad bolje pročitam, znači hoće da ih "sravni".

Možda treba $i zaviti u navodnike, mada uvek pomešam koje pa obično probam sve tri varijante: "...", '...', i obrnute `...`
Prijavi uredniku   Sačuvana

RiSK
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 628


sleep`walker


« Odgovor #4 poslato: 01 Мај 2008, 18:25:19 »

Ma 'double quotes' ili naski navodi se koriste za to. Treba da boravi "$i"
Prijavi uredniku   Sačuvana

Gradimo
Narodu
Unix
foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #5 poslato: 01 Мај 2008, 18:30:44 »

Obrnuti se nesto cudno ponasaju, i na prvi pogled ne mogu da skapiram sta se desava sa stringovima. Ovi jednostruki ne mogu posto ne podrzavaju interpolaciju, a ovi dupli ne postizu nista.

Ma, nesto se meni cini da vec kod

for i in $(...)

on razdvaja stringove po razmacima.
Prijavi uredniku   Sačuvana

foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #6 poslato: 01 Мај 2008, 18:33:35 »

BTW, kad smo vec kod shell programiranja, sta vi mislite o zsh shellu?
Prijavi uredniku   Sačuvana

RiSK
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 628


sleep`walker


« Odgovor #7 poslato: 01 Мај 2008, 19:00:41 »

Back-quotes sluze za razvijanje stringa u komandu. Sve sto je izmedju dva back-quota (`) se tretira kao komanda, zatim se izlaz te komande stavlja na mesto gde je bio unos apostrofima i ponovo izvrsava kao komanda.
Evo primer da ti bude jasnije: Kada ukucas
Kod:
echo dmesg
Ispuisacese red u kome pise dmesg (da ne poverujes Smiley)
Kada ukucas
Kod:
`echo dmesg`
Desice se sledece: bash razvija komandu ovicenu znacima obrnutih navoda. Komanda izmedju dva znaka ` se izvrsava. Izlaz te komande se, zatim, pise na mesto same komande. Izlaz komande "echo dmesg" je samo "dmesg", tako da ce se pocetka komanda komanda razviti u komandu
Kod:
dmesg
i ova ce se izvrsiti tako da joj izlaz bude prikazan u terminalu.

Valjda sam ti nesto objasnio Smiley

Strong-quotes (apostrof) i soft-quotes (navodnici) se razikuju po tome sto se ispod apostrofa ne razvija nista, dok se ispod navoda razvijaju promenljive. Npr.
Kod:
echo '$HOME'
stampa $HOME a
Kod:
echo "$HOME"
stampa tvoj home direktorijum.

Sto se tice skripte, da greska je u zaglavlju ciklusa. Tek sada sam pogledao sta ti ustvari radis.

Ovo sto hoces da uradis se radi malo elegantnije. Kmanda find ima svic -exec kojom se navedena komanda primenjuje na jedan od izlistanih fajlova. Slicnu stvar (neki kazu efikasnije) mozes izvesti kombinacijom find|xargs.

Komanda koja menja ciklus i find bi trebala da izgleda ovako:
Kod:
cd /sta/kopiras && find -exec cp {} /gde/kopiras/ \;
Pogledaj man strane za find i xargs za vise informacija. Imas dobro citanje i ovde http://www.bsd-srbija.org/dokumentacija/doku.php/koriscenje_find_komande

Sto se tice zsh-a odlican je, ali pre svega za interaktivan rad. Ima gomilu completitiona, prepravki i dzidzamidza. Obozavbam ga sto se toga tice. Za skripte nema nikakvu prednost nad bash-om (za sve sto ima viska u odnosu na bash postoji zaobilaznica). Sa druge strane glomazniji je i sporije se izvrsava. Tako da skriptuj u bashu Wink
Prijavi uredniku   Sačuvana

Gradimo
Narodu
Unix
foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #8 poslato: 01 Мај 2008, 19:05:06 »

Ok, hvala. Nisam znao za te viticaste zagrade {} u -exec argumentu. Ali ono, glupo bi bilo da ih nema, kad bolje razmislim. Hvala, RiSK, pomogao si mi BASH dosta. Cheesy
Prijavi uredniku   Sačuvana

RiSK
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 628


sleep`walker


« Odgovor #9 poslato: 01 Мај 2008, 19:20:08 »

Ma nema na cemu. Tu smo da se pomazemo koliko mozemo.
Srecno bashanje Wink
Prijavi uredniku   Sačuvana

Gradimo
Narodu
Unix
foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #10 poslato: 01 Мај 2008, 19:45:45 »

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?
Prijavi uredniku   Sačuvana

foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #11 poslato: 01 Мај 2008, 20:11:50 »

Sto 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.
Prijavi uredniku   Sačuvana

soxxx
Newbie
*
Van mreže Van mreže

Poruke: 23


« Odgovor #12 poslato: 02 Мај 2008, 16:33:22 »

Mislim 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.

-print 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 xargs zato sto ne pokrece (forkuje) poseban proces za svaki fajl kao sto to radi -exec, kao sto je RiSK rekao. Medjutim xargs se ne snalazi bas najbolje ponekad sa fajlovima koji imaju prazno polje u imenu. Onda moze da se koristi "find . -print0 | xargs0 komanda".
Jos jedno (POSIX) resenje za ovaj problem sa praznim poljima u imenima fajlova je "-exec +". Pogledaj man stranice. Wink Evo ti jedan tutorijal za find (pogledaj i onaj link koji ti je RiSK ostavio):

http://www.hccfl.edu/pollock/Unix/FindCmd.htm

Pozdrav
Prijavi uredniku   Sačuvana
foxbunny
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 2436



WWW
« Odgovor #13 poslato: 02 Мај 2008, 21:15:31 »

Mislim 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.

-print 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. Wink

Ako imas dosta fajlova prednost je da se koristi xargs zato sto ne pokrece (forkuje) poseban proces za svaki fajl kao sto to radi -exec, kao sto je RiSK rekao. Medjutim xargs se ne snalazi bas najbolje ponekad sa fajlovima koji imaju prazno polje u imenu. Onda moze da se koristi "find . -print0 | xargs0 komanda".
Jos jedno (POSIX) resenje za ovaj problem sa praznim poljima u imenima fajlova je "-exec +". Pogledaj man stranice. Wink Evo ti jedan tutorijal za find (pogledaj i onaj link koji ti je RiSK ostavio):

http://www.hccfl.edu/pollock/Unix/FindCmd.htm

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. Cheesy
Prijavi uredniku   Sačuvana

Časlav Ilić
Full Member
***
Van mreže Van mreže

Pol: Muškarac
Poruke: 224



« Odgovor #14 poslato: 03 Мај 2008, 10:29:41 »

Pored toga što ne pokreće novi proces za svaki argument (osim ako baš hoćemo), meni je obrazac find ... | xargs ... zgodniji od find ... -exec 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 .svn/ u imenu:
Kod:
$ find odredisni/dir/ -type f -print0 | grep -Zz -v '\.svn/' | xargs -0 cp -t ciljni/dir/
(opcija -t uz cp obrće redosled argumenata, tj. cp -t ciljni/dir/ datoteke — mogu da se opkladim uvedeno baš radi xargs :)
Prijavi uredniku   Sačuvana
Stranice: [1] 2   Idi gore
  Štampaj  
 
Prebaci se na: