2011-06-30 7 views
28

sé que no es de esta opción para el comando find de Unix: noUNIX find: ¿opuesto a la opción -newer existe?

find -version 
GNU find version 4.1 

    -newer file Compares the modification date of the found file with that of 
     the file given. This matches if someone has modified the found 
     file more recently than file. 

es una opción que le permitirá a encontrar los archivos que son mayores que un determinado archivo. Me gustaría eliminar todos los archivos de un directorio para su limpieza. Entonces, una alternativa donde encontraría todos los archivos anteriores a N días también haría el trabajo.

Respuesta

32

Se puede utilizar un ! para anular la operación -newer así:

find . \! -newer filename 

Si usted quiere encontrar los archivos que estaban modificada por última vez hace más de 7 días de usar:

find . -mtime +7 

ACTUALIZACIÓN:

Para evitar la coincidencia en el archivo que está comparando con el uso de los siguientes:

find . \! -newer filename \! -samefile filename 
+1

Es importante tener en cuenta que esta lógica sería "igual o anterior a". Entonces, incluiría el archivo de referencia si está en la ruta. Ver, la respuesta de Marty a continuación para una mejor solución. – swdev

+0

La respuesta de Marty también evitará la coincidencia de archivos con el mismo nombre que el archivo de prueba. Actualicé mi respuesta con una prueba que excluye el archivo contra el que se prueba. – qbert220

6

sólo puede utilizar la negación:

find ... \! -newer <reference> 

También puede intentar la familia -mtime/-atime/-ctime/-Btime de opciones. No recuerdo de inmediato cómo funcionan, pero podrían ser útiles en esta situación.

Tenga cuidado con la eliminación de archivos de una operación find, especialmente uno que se ejecuta como raíz; Hay muchas formas en que un proceso malicioso y sin privilegios en el mismo sistema puede engañarlo para que borre cosas que no quería eliminar. Le recomiendo que lea la sección completa "Deleting Files" del GNU find manual.

2

Tenga en cuenta, que la negación de los nuevos medios "de más edad o de la misma marca de tiempo":

Como se puede ver en este ejemplo, se volvió también el mismo archivo:

[email protected]:/home/thomas/tmp/ touch test 
[email protected]:/home/thomas/tmp/ find ./ ! -newer test 
./test 
4

Si sólo necesita archivos que son mayores de archivo "foo" y no el propio foo, excluir el archivo por su nombre utilizando la negación:

find . ! -newer foo ! -name foo 
1

Desafortunadamente, se encontró no apoya esta ! -newer no significa más viejo. Solo significa que no es más nuevo, pero también coincide con archivos que tienen el mismo tiempo de modificación. Así que prefiero usar

for f in path/files/etc/*; do 
    [ $f -ot reference_file ] && { 
     echo "$f is older" 
     # do something 
    } 
done