Trova i file filtrati da più estensioni


52

Qual è la sintassi corretta per:

find . -type f -name \*.\(shtml\|css\)

Funziona, ma non è elegante:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Come fare lo stesso, ma con meno tasti?

Risposte:


75

È possibile combinare diverse espressioni di ricerca con gli operatori logici -oro -and, in modo che il proprio caso possa essere scritto come

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Questo dimostra anche che non è necessario sfuggire a caratteri shell speciali quando si usano le virgolette.

modificare

Since -orha una precedenza inferiore rispetto a quella implicita -andtra -typee la prima -nameparte del nome tra parentesi come suggerito da Chris.


Ciò stamperà anche le directory denominate "* .css".
Teddy

Hmm, le parentesi nella tua versione aggiornata sono un po 'fuori posto. Le singole parentesi devono finire come parametri separati da trovare , quindi hanno bisogno di spazi intorno a loro (`" .css ")` `si traduce in un singolo valore di stringa; è uguale a (es.) `` .css) ' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, non tra esso e il suo' operando ').
Chris Johnsen,

15

Ecco un modo per fare la tua prima versione:

find -type f -regex ".*/.*\.\(shtml\|css\)"

12

Devi includere tra parentesi solo per includere i file:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bonus : questa è sintassi conforme a POSIX.


4

Mi ritrovo spesso a finire con egrep, o pipe più lunghe, o perl per filtri ancora più complessi:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Potrebbe essere un po 'meno efficiente, ma di solito non è un problema, e per cose più complesse è di solito più facile da costruire e modificare.

L'avvertenza standard si applica al non utilizzo di questo per file con nomi di file strani (ad es. Contenenti newline).


+1 per una soluzione pulita e modulare, i colli di bottiglia delle prestazioni di solito si verificano durante l'elaborazione dei file risultanti dai risultati della ricerca.
Cristik,
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.