Quando sto usando
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
trova tutti i tipi di file. Ma quando aggiungo -exec
alla fine:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
sembra che stampi solo .txt
File. Cosa sbaglio?
Nota:utilizzando MINGW (Git Bash)
Risposta accettata:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
è l'abbreviazione di:
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
Cioè, perché nessuna azione il predicato è specificato (solo condizioni ), un -print
viene aggiunta implicitamente un'azione per i file che soddisfano le condizioni.
(e, a proposito, ciò stamperebbe .js
non regolare file (il -type f
si applica solo a .htm
file)).
Mentre:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
è l'abbreviazione di:
find . ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )
Per find
(come in molte lingue), AND (-a
; implicito quando omesso) ha la precedenza su OR (-o
) e aggiungendo un predicato di azione esplicito (qui -exec
) annulla il -print
azione implicita vista sopra. Ecco, vuoi:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" )
-exec sh -c 'echo "$0"' {} ;
Oppure:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Per evitare di eseguire un sh
per file.