2011-09-05 3 views
13

J'ai une liste de fichiers dans file.lst. Maintenant, je veux trouver tous les fichiers dans un répertoire dir qui ont plus de 7 jours, sauf ceux du fichier file.lst. Comment puis-je soit modifier la commande find ou supprimer toutes les entrées dans file.lst à partir du résultat?rechercher des fichiers ne figurant pas dans une liste

Exemple:

file.lst:

a 
b 
c 

Exécuter:

find -mtime +7 -print > found.lst 

found.lst:

a 
d 
e 

donc ce que je pense est:

d 
e 

Répondre

20

pipe votre commande par findgrep -Fxvf:

find -mtime +7 -print | grep -Fxvf file.lst 

Ce que les drapeaux signifient:

-F, --fixed-strings 
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  
-x, --line-regexp 
       Select only those matches that exactly match the whole line. 
-v, --invert-match 
       Invert the sense of matching, to select non-matching lines. 
-f FILE, --file=FILE 
       Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. 
+0

Est-ce que cela fonctionnera? la sortie de 'find' pour, par exemple, le fichier 'a' dans cwd est'./a' qui fera que '-Fx' échoue à correspondre ... –

+0

Que diriez-vous si j'ai besoin de construire dynamiquement la liste de fichiers, par exemple. avec 'ssh xyz.com 'ls/var/backups/daily | queue -10''? Ce serait au lieu d'avoir la liste des noms de fichiers dans file.lst. J'ai essayé la tuyauterie ici, mais ne peux pas tout à fait le comprendre (mon tuyau-fu est faible). – Jacob

3

pipe la commande find-grep utilisant le -v et -f commutateurs

find -mtime +7 -print | grep -vf file.lst > found.lst 

options de grep:

-v : invert the match 
-f file: - obtains patterns from FILE, one per line 

exemple:

$ ls 
a b c d file.lst 

$ cat file.lst 
a$ 
b$ 
c$ 


$ find . | grep -vf file.lst 
. 
./file.lst 
./d 
+0

Je pense que cela correspond la plupart du cases.However, s'il y a un nom de fichier comme « aa », probablement cela échouera – ajreal

+0

@ajreal, vrai, pourrait utiliser 'a $' dans file.lst pour réduire cette possibilité –

+0

@Fredrik: vous devez utiliser un modèle de chaîne fixe. 'grep -F' ou' fgrep' –

Questions connexes