Eliminar archivos anteriores a un archivo específico

14

Necesito eliminar de una carpeta todos los archivos anteriores a un archivo específico.
Ejecutando bash en CentOS 7.

Tengo una solución para esto, pero creo que debería haber una forma más elegante de hacerlo:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done
csny
fuente

Respuestas:

28

No lo he probado, pero finddebería poder manejar toda la operación bien:

$ find dir/ -type f ! -newer reference -delete

... o ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Básicamente:

  • ! -newer referencecoincide con archivos que se han modificado menos recientemente que reference.
  • -delete los elimina
  • ! -name referenceexcluye reference, en caso de que también se encuentre debajo dir/y desee conservarlo.

Esto debería eliminar todos los archivos anteriores referencey ubicados en dir/.

John WH Smith
fuente
2
Perfecto :). Recién agregado -maxdepth 1para mantener la búsqueda no recursiva
csny
3
! -newersignifica "no más nuevo", entonces "más viejo o la misma edad "; el archivo en sí coincidirá si está en la ruta que se findve, solo algo a tener en cuenta.
ferada
1
@ferada No lo hará si lo excluye, por eso mi respuesta también incluye ! -name reference(vea la tercera viñeta).
John WH Smith
7

comparar los tiempos de modificación de archivos a test, usando -nt(más nuevo que) y -ot(mayor que) los operadores:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi
serenesat
fuente
2
Gracias, eso es mejor que mi solución, pero aún necesita iterar todos los archivos en la carpeta y comparar ... La otra respuesta es aún más elegante
csny