Utilizzando `find` per più estensioni di file


16

Sto usando il seguente comando per contare le righe di testo nei file JAVA:

find . -name '*.java' | xargs wc -l

Come posso modificare i findparametri di comando in modo che corrispondano a più di un'estensione di file? Ad esempio, vorrei utilizzare l'operazione sopra per i file CPP, C e H.


Questa domanda riguarda in realtà il findcomando, poiché è qui che stai cercando i file corrispondenti.
iglvzx,

1
Inoltre, utilizzare il find -print0 | xargs -0costrutto o anche migliore e più semplice: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Ciò eviterà qualsiasi problema relativo al nome del file (spazi vuoti, nuove righe e così via) ed è (molto) personalizzato.
Daniel Andersson,

Risposte:


16

Utilizzare l' -oopzione per un OR. Ad esempio, questo elenco .cpp, .ce .hfile:

find . -name \*.cpp -o -name \*.c -o -name \*.h

Ah. I *bisogni più essere sfuggiti se formattato come codice. Totalmente trascurato. :)
iglvzx,

Sì, ci sono volute tre modifiche da due persone ma ce l'abbiamo fatta.
JOTN,

2
Questo non ha funzionato per me su OSX (corrisponde solo al cognome * .ext) - Ho dovuto usare le parentesi come suggerito da @smokinguns di seguito.
Gilead,

2

Dovrai usare l'opzione -o. Ad esempio l'istruzione seguente trova tutti i file png, jpg e gif in una cartella.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Uso l'opzione -iname in modo che la corrispondenza non faccia distinzione tra maiuscole e minuscole.


1
iname non è disponibile su tutte le versioni di find.
JOTN,


1

Mentre tutte le risposte sono più o meno le stesse, non le trovo leggibili con più nomi e operatori booleani nel mezzo.

Penso che questa potrebbe essere una soluzione più elegante:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Rompiamo questo

  • find . trova tutti i file in modo ricorsivo nel percorso corrente (cambiare in qualche altro percorso se necessario)
  • -type frestringe la ricerca solo ai file (non troppo di un guadagno di velocità, ma comunque ...)
  • | grep -EHo usato questo per far riconoscere grep o ( |) l'operatore in Mac OS X che utilizza FreeBSD grep , GNU grep non ne ha bisogno (controlla nel tuo manfile).
  • "\.java$|\.cpp$|\.c$"espressione regolare che include i file il cui nome termina con .java, .cppe .c(quelli aggiuntivi è necessario)

È quindi possibile reindirizzare l'elenco risultante per ulteriori elaborazioni, ad es

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Questo esempio rimuove la CRLFfine della riga DOS / Windows per OS X / Linux LF(questa è anche sedsintassi di OS X , controlla le specifiche della tua versione).


Volevo trovare tutti i tipi di file video utilizzando 25 diversi parametri di corrispondenza delle estensioni. Questo è stato l'unico approccio che ha funzionato per me. (Ubuntu 14.04 LTS)
Elder Geek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.