Trouver des fichiers filtrés par plusieurs extensions

52

Quelle est la syntaxe correcte pour:

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

Cela fonctionne, mais est inélégant:

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

Comment faire la même chose, mais en moins de frappe?

Dave Jarvis
la source

Réponses:

75

Vous pouvez combiner différentes expressions de recherche avec les opérateurs logiques -orou -and, de sorte que votre cas puisse être écrit comme suit:

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

Cela montre également qu'il n'est pas nécessaire d'échapper à des caractères spéciaux du shell lorsque vous utilisez des guillemets.

Modifier

Since -ora une priorité inférieure à celle implicite -andentre -typeet la première -namepartie entre parenthèses, comme suggéré par Chris.

Benjamin Bannier
la source
Cela imprimera également des répertoires nommés "* .css".
Teddy
Hmm, les parenthèses dans votre version mise à jour sont un peu mal placées. Les parenthèses individuelles doivent se retrouver sous forme de paramètres distincts à rechercher . Elles ont donc besoin d'espaces autour (`" .css ")` résulte en une seule valeur de chaîne; c'est le même que (par exemple) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, pas entre lui et son 'opérande').
Chris Johnsen
15

Voici une façon de faire votre première version:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Dennis Williamson
la source
12

Vous devez mettre entre parenthèses uniquement les fichiers:

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

Bonus : il s'agit d'une syntaxe compatible POSIX.

Nounours
la source
4

Je me retrouve souvent à utiliser des tubes egrep ou 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'

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

La mise en garde standard concerne le fait de ne pas utiliser ceci pour les fichiers avec des noms de fichiers étranges (contenant par exemple des nouvelles lignes).

Reinierpost
la source
+1 pour une solution propre et modulaire, les goulots d'étranglement des performances se produisent généralement lors du traitement des fichiers résultant des résultats de la recherche.
Cristik