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?

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.


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\)"

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.


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).


+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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.