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.