59 votes

Trouver des fichiers filtrés par des extensions multiples

Quelle est la syntaxe correcte pour :

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

Cela fonctionne, mais c'est inélégant :

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

Comment faire de même, mais en moins de frappes ?

83voto

Michael Medin Points 605

Vous pouvez combiner différentes expressions de recherche avec les opérateurs logiques. -or o -and donc votre cas peut être écrit comme suit

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

Cela montre également que vous n'avez pas besoin d'échapper les caractères spéciaux Shell lorsque vous utilisez des guillemets.

編集

Depuis -or a une priorité inférieure à celle de l'implicite -and entre -type et le premier -name mettre la partie nom entre parenthèses comme suggéré par Chris.

18voto

Damian Powell Points 315

Voici une façon de réaliser votre première version :

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

15voto

Teddy Points 6368

Vous devez mettre entre parenthèses pour inclure uniquement les fichiers :

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

Bonus : il s'agit d'une syntaxe conforme à la norme POSIX.

4voto

Fern Moss Points 8273

Je me retrouve souvent à utiliser egrep, ou des pipes plus longs, ou perl pour des filtres encore plus complexes :

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

Il peut être un peu moins efficace, mais ce n'est généralement pas un problème, et pour les choses plus complexes, il est généralement plus facile à construire et à modifier.

L'avertissement standard s'applique pour ne pas l'utiliser pour des fichiers avec des noms de fichiers bizarres (par exemple, contenant des nouvelles lignes).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X