GNU/Linux >> Znalost Linux >  >> Linux

najděte a zkopírujte všechny obrázky v adresáři pomocí terminálu linux mint a snažte se porozumět syntaxi

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


Linux
  1. Přejmenujte všechny soubory a názvy adresářů na malá písmena v Linuxu

  2. Linux Najít a odebrat všechny symbolické odkazy týkající se adresáře?

  3. najít a odstranit soubory s mezerou pomocí příkazu find v Linuxu

  1. Jak najít a zkopírovat určitý typ souborů z jednoho adresáře do druhého v Linuxu

  2. Nalezení adresáře v linuxovém terminálu

  3. Jak pomocí příkazu cp v linuxovém shellu zkopíruji celý adresář do jiného adresáře?

  1. Jak odstranit adresář a složku v Linuxu?

  2. Použití příkazů Sed,ex a perl k vyhledání a nahrazení textu v Linuxu

  3. najít a zkopírovat soubor pomocí Bash