2011-09-05 12 views
13

Tengo una lista de archivos en file.lst. Ahora quiero encontrar todos los archivos en un directorio dir que son anteriores a 7 días, excepto aquellos en el archivo file.lst. ¿Cómo puedo modificar el comando find o eliminar todas las entradas en file.lst del resultado?buscar archivos que no están en una lista

Ejemplo:

file.lst:

a 
b 
c 

Ejecutar:

find -mtime +7 -print > found.lst 

found.lst:

a 
d 
e 

así que lo que esperamos es:

d 
e 

Respuesta

20

Pipe su find de comandos a través grep -Fxvf:

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

Qué significan las banderas:

-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

¿Funcionará? la salida de 'find' para, p. el archivo 'a' en cwd es'./a' que hará que '-Fx' no coincida ... –

+0

¿Qué tal si necesito construir dinámicamente la lista de archivos, p. con 'ssh xyz.com 'ls/var/backups/daily | cola -10''? Esto sería en lugar de tener la lista de nombres de archivo en file.lst. He intentado conectar aquí, pero no puedo entenderlo (mi tubería fu es débil). – Jacob

3

Pipe el hallazgo mando a grep utilizando el -v y -f interruptores

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

opciones grep:

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

ejemplo:

$ ls 
a b c d file.lst 

$ cat file.lst 
a$ 
b$ 
c$ 


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

Creo que esto coincide con la mayor parte del cases.However, si hay un nombre de archivo como 'AA', probablemente esto fallará – ajreal

+0

@ajreal, cierto, podría usar 'a $' en file.lst para reducir esa posibilidad –

+0

@Fredrik: debe usar un patrón de cadena fijo. 'grep -F' o' fgrep' –

Cuestiones relacionadas