find, grep, xargs...CHYBNE ZADANA ULOHA - takze este raz

Jan Stary hans at stare.cz
Thu Apr 10 14:26:45 CEST 2008


On Apr 10 13:21:58, Lubomir Majersky wrote:
> Uloha (opravena):
> Najst medzi 10-kami tisic suborov subory, ktorych obsah (vnutri) 
> vyhovuje vzorke "XYZ" a tie nasledne prekopirovat (alebo presunut) do 
> ineho adresara. Spolocnym znakom vsetkych tych suborov je, ze cast nazvu 
> je rovnaka. Aby to bolo este zrozumitelnejsie, tak uvadzam zjednoduseny 
> tvar nazvov suborov:
> "blabla000001", "blabla000002",..."blabla00000X",..."blablaXXXXXX"

find /src -name blabla\* -type f | xargs grep -l XYZ | cpio -pduv /dst

Na kopirovani velkeho poctu souboru (aka "cp: arg list too long")
je cpio(1) vybornej: cpio -p (pass-through) cte seznam souboru
ke kopirovani na stdinu.

Nicmene cpio(1) zachovava pri tomto kopirovani celou cestu,
neboli zachova celou adresarovou strukturu te mnoziny souboru;
tj. napriklad	/src/path/some/where/blabla000123
prejde na	/dst/path/some/where/blabla000123
nikoli na	/dst/blabla000123

Otazka je, zda to vyhovuje, nebo maji byt vsechny prekopirovany
do spolecneho adresare as in /dst/blablaXXXXXX. Pokud chces tu
strukturu zachovat (anebo Ti to aspon nevadi), viz vyse.

Pokud maji vsechny prijit primo do /dst, mas zaruku, ze se v /src
nevyskytuje soubor stejneho jmena v ruznych adresarich? Tj napr.
/src/path/blabla123 a /src/other/path/blabla123, kdy bys jednu
kopii /dst/blabla123 prepsal druhou, pozdejsi?

Pokud takovou zaruku nemas, tak je holt do jednoho adresare kopirovat
nemuzes (leda by sis je prepisoval, coz predpokladam vadi). Pokud to
zaruceno mas, staci pri kopirovani "zahazovat cestu" - toho se da napr.
v tar(1) a pax(1) dosahnout pomoci '-s replstr', coz ale cpio(1) neumi.
Takze vaianty pro pax(1):

find /src -name blabla\* -type f | xargs grep -l XYZ | pax -rw /dst/
find /src -name blabla\* -type f | xargs grep -l XYZ | pax -rws ',^.*/,,' /dst/

	H.




More information about the Users-l mailing list