2011-10-01 18 views
5

Desactivé algo en un directorio que ya contenía muchas cosas. Quería desentrañar en un directorio separado en su lugar. Ahora hay demasiados archivos para distinguir. Sin embargo, los archivos que he anulado han sido creados en este momento (¿no?) Y los archivos originales no se han modificado por mucho tiempo (al menos un día). ¿Hay alguna forma de eliminar solo estos archivos sin marcar según su información de creación?¿Cómo eliminar todos los archivos que se crearon recientemente en un directorio en Linux?

Respuesta

6

Tar normalmente restaura las marcas de tiempo del archivo, por lo que no es probable que el filtrado por el tiempo funcione.

Si todavía tiene el archivo tar, que se puede utilizar para eliminar lo que se ha descomprimido con algo como:

tar tf file.tar --quoting-style=shell-always |xargs rm -i 

Lo anterior funcionará en la mayoría de los casos, pero no todos (los nombres de archivo que tienen un retorno de carro en ellos se romperá), así que ten cuidado.

Puede eliminar los directorios agregando -r a eso, pero probablemente sea más seguro simplemente eliminar los directorios de nivel superior manualmente.

+2

Es realmente fácil hacer que funcione con espacios en los nombres de archivo, y esa sería una respuesta mucho mejor. – Omnifarious

+0

@omnifa ¿cómo hacer que esto funcione con espacios? para eliminar los directorios extraídos, ¿debería también incluir -R después de rm? – AnkurVj

+0

@AnkurVj: Desafortunadamente, no hay una manera de hacer que tar le proporcione una lista de nombres de archivos separados por caracteres nulos, lo cual es bastante decepcionante. Y sí, debería haber un '-r' después de' rm'. Como Mat no está actualizando la respuesta, pondré la mía. – Omnifarious

3

encontrar. -mtime -1-tipo f | xargs rm

pero prueba primero con

hallazgo. -mtime -1-tipo f | xargs echo

+2

Esto sería bueno, excepto por dos cosas. Primero, ** siempre ** use '-print0' y' xargs -0'. No desea que los caracteres de espacio aleatorio en los nombres de archivo le causen problemas. En segundo lugar, 'tar' restaura las marcas de tiempo, por lo que no puedes usar mtime aquí. Tal vez, a veces, tal vez, si su sistema de archivos ha sido configurado para actualizarlo. – Omnifarious

+0

Además, tenga en cuenta, por ejemplo, encuentre -mmin -10 para archivos modificados en los últimos diez minutos – sehe

1

Existen varias respuestas diferentes a esta pregunta en orden creciente de complejidad.

En primer lugar, si está desactualizado, y en este caso en particular, está absolutamente seguro de que no hay caracteres extraños en sus nombres de archivo (los espacios están bien, pero no las pestañas, líneas nuevas u otros caracteres de control ni caracteres Unicode) esto funcionará:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r 

todo lo que es egrepping a saltar hacia fuera en todos los subdirectorios de los subdirectorios.

Otra manera de hacer esto que funciona con nombres de archivo enrrollado es la siguiente:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
for file in *; do rm -rf ../"$file"; done 

que va a crear un directorio en el que su archivo se ha ampliado, pero suena como que quería que ya de todos modos. Tampoco maneja ningún archivo cuyos nombres comiencen con ..

Para hacer que el método funcione con archivos que comienzan con ., hacer esto:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "[email protected]"; do rm -rf ../"$file"; done' junk 

Por último, tomando de Mat's answer, usted puede hacer esto y funcionará para cualquier nombre de archivo y no se requieren para descomprimir el directorio nuevo:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "[email protected]"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r 
0

puede manejar archivos y directorios en una sola pasada con:

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash 

se puede ver lo que va a ocurrir dejar fuera de la tubería a la 'fiesta'

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort 

para manejar nombres de archivo con saltos de línea que necesita más procesamiento.

Cuestiones relacionadas