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.