Nejprve pochopte, že trubka "|" Příkazy links spojují výstup prvního do druhého jako argument. Vaše dva shelly zakódují oba výstup příkazu find do jiných příkazů (grep a xargs). Podívejme se na tyto příkazy jeden po druhém:
První příkaz:najít
find je program pro "hledání souborů v adresářové hierarchii" (to je vysvětlení z manuálové stránky find). Syntaxe je (v tomto případě)
find <search directory> <search pattern> <action>
V obou případech je vyhledávací adresář . (to je aktuální adresář). Všimněte si, že neprohledává pouze aktuální adresář, ale také všechny jeho podadresáře (hierarchii adresářů).
Vzor hledání akceptuje mimo jiné volby -name (to znamená, že hledá soubory, jejichž název odpovídá vzoru uvedenému jako argument této volby) nebo -iname (stejný jako název, ale nerozlišuje se malá a velká písmena).
Vzor akce může být -print0 (vytiskne přesný název souboru včetně jeho pozice v daném vyhledávacím adresáři, tj. relativní nebo absolutní cestu k souboru) nebo -exec (provede daný příkaz na souborech, příkaz je být ukončen ";" a každý výskyt "{}" je nahrazen názvem souboru).
To znamená, že první kód shellu (první část, vlevo od roury)
find . -iname \*.jpg -print0
prohledá všechny soubory s koncovkou ".jpg" v aktuální hierarchii adresářů a vytiskne jejich cesty a názvy. Druhý (první část)
find . -name '*' -exec file {} \;
najde všechny soubory v aktuální hierarchii adresářů a provede
file <filename>
na ně. Soubor je další příkaz, který určuje a vytiskne typ souboru (podrobnosti najdete na stránce manuálu, soubor man).
Druhý příkaz:xargs
xargs je příkaz, který „vytváří a spouští příkazové řádky ze standardního vstupu“ (man xargs), tj. z výstupu find, který je vložen do xargs. Příkaz, který vytvoří a provede, je v tomto případě
cp -v {} /home/joachim/neu2"
Volba -I{} definuje nahrazující řetězec, tj. každá instance {} v příkazu má být nahrazena vstupem, který získá ze souboru (tj. názvy souborů). Volba -0 definuje, že vstupní položky nejsou ukončeny (oddělovány) mezerami nebo novými řádky, ale pouze znakem null. To se zdá být nezbytné při použití a standardní způsob, jak se vypořádat s find výstup jako vstup xargs.
Příkaz, který je sestaven a proveden, je pak samozřejmě příkaz copy s volbou -v (verbose) a zkopíruje všechny názvy souborů, které získá z find, do adresáře.
Třetí příkaz:grep
grep filtruje svůj vstup a dává pouze ty řádky nebo řetězce, které odpovídají konkrétnímu výstupnímu vzoru. Volba -o říká grep, aby vytiskl pouze odpovídající řetězec, nikoli celý řádek (viz man grep), -P říká, že má interpretovat následující vzor jako vzor regulárního výrazu perlu. V regulárním výrazu perl je ^ začátek řádku, .+ je libovolný libovolný řetězec, za tímto libovolným řetězcem by pak měla následovat dvojtečka, mezera, počet alfanumerických znaků (v regulárním výrazu perlu označovaný \w+), mezera a řetězec "obraz". Tento příkaz grep v podstatě filtruje výstup souboru tak, aby vydával pouze názvy souborů, které jsou soubory obrázků. (Přečtěte si o regulárních výrazech perl například zde:http://www.comp.leeds.ac.uk/Perl/matching.html )
Příkaz, který jste skutečně chtěli
Nyní, co chcete udělat, je (1) převzít výstup druhého příkazu shellu (který uvádí soubory obrázků), (2) převést jej do příslušného tvaru a (3) převést jej do příkazu xargs z prvního příkazu shellu. řádek (který pak vytvoří a provede požadovaný příkaz kopírování). Tentokrát tu tedy máme třífázový (ve skutečnosti čtyř) příkaz shell se dvěma rourami. Není problem. Již máme fáze (1) a (3) (ačkoli ve fázi (3) musíme vynechat možnost -0, protože vstup již není najít výstup; potřebujeme jej, abychom zacházeli s novými řádky jako s oddělovači položek).
Stupeň (2) stále chybí. K tomu doporučuji použít příkaz cut. cut mění řetězce py jejich rozdělením do různých polí (oddělených oddělovacím znakem v původním řetězci), která pak lze přeskupit. Zvolím jako oddělovací znak ":" (tímto končí název souboru ve výstupu grep, volba -d':') a řeknu mu, aby nám poskytl pouze první pole (volba -f1, essentialls:tisknout pouze název souboru, nikoli část, která následuje za ":"), tj. fáze (2), by pak byla
cut -d':' -f1
A celý požadovaný příkaz pak bude:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2
Všimněte si, že všechny manuálové stránky můžete najít například zde:http://www.linuxmanpages.com