GNU/Linux >> Znalost Linux >  >> Linux

`najít` s více `-name` a `-exec` provést pouze poslední shody `-name`?

Když používám

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

najde všechny typy souborů. Ale když přidám -exec na konci:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;

zdá se, že vytiskne pouze .txt soubory. Co dělám špatně?

Poznámka:pomocí MINGW (Git Bash)

Přijatá odpověď:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

je zkratka pro:

find . ( ( -type f -a -name "*.htm*" ) -o 
          ( -name "*.js*" ) -o 
          ( -name "*.txt" ) 
       ) -a -print

To znamená, že žádná akce je zadán predikát (pouze podmínky ), -print akce je implicitně přidána pro soubory, které splňují podmínky.

(a mimochodem, to by vytisklo nestandardní .js soubory (-type f platí pouze pro .htm soubory)).

Zatímco:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" 
  -exec sh -c 'echo "$0"' {} ;

je zkratka pro:

find . ( -type f -a -name "*.htm*" ) -o 
       ( -name "*.js*" ) -o 
       ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )

Pro find (jako v mnoha jazycích), A (-a; implicitní při vynechání) má přednost před NEBO (-o ) a přidání explicitního predikátu akce (zde -exec ) zruší -print implicitní akce viz výše. Tady chcete:

find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) 
  -exec sh -c 'echo "$0"' {} ;

Nebo:

find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
   for i do
     echo "$i"
   done' sh {} +

Chcete-li se vyhnout spuštění jednoho sh na soubor.


Linux
  1. CloudCross – Synchronizace souborů a adresářů s více cloudovými úložišti

  2. Získání informací pomocí příkazu vsish (pouze esxi)

  3. Co je špatného na mém bash skriptu, který ponechává posledních x souborů a zbytek smaže?

  1. Jak spustit Grep s více a vzory?

  2. Jak přesunout soubory a zobrazit průběh (např. pomocí ukazatele průběhu)?

  3. více fyzických rozhraní s adresami IP ve stejné podsíti

  1. $_ vs! $. Poslední argument předchozího příkazu a přesměrování výstupu?

  2. Synchronizace více domovských složek pomocí Dropboxu a symbolických odkazů?

  3. Můj bootloader nelze zkompilovat s gcc 4.6 a 4.7 ... pouze 4.5