web-dev-qa-db-fra.com

Exclure la liste des fichiers de la recherche

Si j'ai une liste de noms de fichiers dans un fichier texte que je veux exclure lorsque j'exécute find, comment faire? Par exemple, je veux faire quelque chose comme:

find /dir -name "*.gz" -exclude_from skip_files

et récupérez tous les fichiers .gz dans/dir à l'exception des fichiers répertoriés dans skip_files. Mais trouver n'a pas de -exclude_from drapeau. Comment ignorer tous les fichiers dans skip_files?

33
Thomas Johnson

Je ne pense pas que find ait une option comme celle-ci, vous pouvez créer une commande en utilisant printf et votre liste d'exclusion:

find /dir -name "*.gz" $(printf "! -name %s " $(cat skip_files))

Ce qui revient à faire:

find /dir -name "*.gz" ! -name first_skip ! -name second_skip .... etc

Vous pouvez également diriger de find vers grep:

find /dir -name "*.gz" | grep -vFf skip_files
46
Josh Jolly

C'est ce que je fais habituellement pour supprimer certains fichiers du résultat (dans ce cas, j'ai cherché tous les fichiers texte mais je n'étais pas intéressé par un tas de rapports de validation de valgrind que nous avons ici et là):

find . -type f -name '*.txt' ! -name '*mem*.txt'

Cela semble fonctionner.

12
Martin G

Je pense que vous pouvez essayer comme

find /dir \( -name "*.gz" ! -name skip_file1 ! -name skip_file2 ...so on \)
8
Jayesh Bhoi
find /var/www/test/ -type f \( -iname "*.*" ! -iname  "*.php" ! -iname "*.jpg" ! -iname "*.png"  \)

La commande ci-dessus donne la liste de tous les fichiers à l'exception des fichiers avec l'extension .php, .jpg ang .png. Cette commande fonctionne pour moi dans PuTTY.

2
Sohel Pathan

La solution grep de Josh Jolly fonctionne, mais a une complexité O (N ** 2), ce qui la rend trop lente pour les longues listes. Si les listes sont triées en premier (complexité O (N * log (N))), vous pouvez utiliser comm, qui a O(N) complexité:

find /dir -name '*.gz' |sort >everything_sorted
sort skip_files >skip_files_sorted
comm -23 everything_sorted skip_files_sorted | xargs . . . etc

man votre ordinateur comm pour plus de détails.

0
Eric Toombs