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.