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?
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:
È possibile combinare diverse espressioni di ricerca con gli operatori logici -or
o -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 -or
ha una precedenza inferiore rispetto a quella implicita -and
tra -type
e la prima -name
parte del nome tra parentesi come suggerito da Chris.
). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before
-name`, non tra esso e il suo' operando ').
Ecco un modo per fare la tua prima versione:
find -type f -regex ".*/.*\.\(shtml\|css\)"
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).