GNU/Linux >> Linux Esercitazione >  >> Linux

`find` con `-name` e `-exec` multipli esegue solo le ultime corrispondenze di `-name`?

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.


Linux
  1. Ruota e archivia i registri con il comando logrotate di Linux

  2. Controlla i comandi e le attività con il comando watch di Linux

  3. Trova file e directory su Linux con il comando find

  4. Importa funzioni e variabili in Bash con il comando sorgente

  5. Navigazione nella shell Bash con pushd e popd

I comandi alias e unalias spiegati con esempi

Come eseguire l'output in coda -f con i colori utilizzando solo Awk e mostrare il resto dell'output?

$_ Vs!$. Ultimo argomento del comando precedente e reindirizzamento dell'output?

Sincronizzare più cartelle Home con Dropbox e collegamenti simbolici?

CloudCross:sincronizza file e directory con più archivi cloud

Cosa c'è di sbagliato nel mio script bash per mantenere gli ultimi file x ed eliminare il resto?