find, grep, xargs...

Dan Lukes dan at obluda.cz
Thu Apr 10 12:57:33 CEST 2008


Lubomir Majersky wrote:
> 	Najst medzi 10-kami tisic suborov, subory so vzorkou 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 . -type f -print | xargs grep -lE 'vzorka-XYZ' > ./vystup.txt && 
> grep -iE 'vzorka-ABC' ./vystup.txt | xargs -J % cp -p % ../adresar

	Ale fuj ! ;-)

	Tak to uz ten vzorek vytridim rovnou v tom findu, ne ?

	find . -type f -name 'blabla*'

	Mozna se ti to nepovedlo, pokuds  ten parametr nenapsal do apostrofu 
(nebo je potreba tu hvezdicku alespon oquotovat). Takze cele je to 
takhle nejak:

find . -type f -name 'blabla*' | xargs cp -p {} ../adresar/

Teda, za predpokladu, ze nazvy souboru jsou "rozumne". Pokud by 
obsahovaly nejake osklive znaky, treba znak konce radku, muselo by se to 
jeste trochu doladit (pridat -print0 k findu, -0 k xargs)


> 	Skusal som pre find zapracovat "-exec" (samozrejme nie v takom zapise 
> ako je vyssie uvedene), ale akosi sa neviem dopracovat k funkcnej 
> konstrukcii.

	A nebo tak (tim to bdue na jeden prikaz, bez xargs):

find . -type f -name 'blabla*' -exec cp {} ../adresar/ ";"

	predpokladam, ze duvod, proc se ti to nepovedlo byl neoquotovany 
strednik (nebo to, ze tam vubec nebyl).

	Ale takhle to bude relativne pomale. Kdyz uz takhle, tak asi lepe 
vyuzit zhanou novinku na poli findu:

find . -type f -name 'blabla*' -exec cp {} ../adresar/ "+"

							Dan




More information about the Users-l mailing list