Acabo de descomprimir un archivo que produjo un desastre de archivos en mi ordenado directorio. Por ejemplo:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Esperaba que el archivo tar se hubiera organizado en una sola carpeta (es decir, myarchive/
), ¡pero no fue así! Ahora tengo unos 190 archivos y directorios que han vomitado digitalmente en lo que era un directorio organizado. Estos archivos sin archivo necesitan ser limpiados.
¿Hay alguna forma de "deshacer" esto y eliminar los archivos y directorios que se extrajeron de este archivo?
Gracias por las excelentes respuestas a continuación. En resumen , esto es lo que funciona con dos pasos (1) eliminar archivos y (2) eliminar la estructura de directorios vacía en orden inverso al empaque (para eliminar primero los directorios externos):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Y aún más seguro, para obtener una vista previa de una ejecución en seco de los comandos agregando echo
después xargs
.
xargs
(entac
lugar desort -r
solo cosméticos), pero aceptas la respuesta con la sustitución del proceso que, como explicaste en los comentarios, ¿no te quedaba bien? Además, active elxargs -d'\n'
cambio en su publicación si desea hacer un resumen para futuros usuarios, para que no se muerdan con espacios en los nombres de archivo.-d'\n'
hasta ahora, y después de un análisis más profundo, su respuesta está realmente más cerca de lo que usé.-d'\n'
radica en el hecho de que si no le dicexargs
que divida los argumentos en nuevas líneas (que es lo que está alimentando) pero en espacios, entonces un archivo con el el nombrefolder1/some file
se leerá comofolder1/some
yname
.Respuestas:
enumerará los contenidos línea por línea.
Esto se puede canalizar
xargs
directamente, pero tenga cuidado : elimine con mucho cuidado. ¡ No desea simplementerm -r
todo lo quetar tf
le dice, ya que puede incluir directorios que no estaban vacíos antes de desempacar!Podrías hacerlo
para eliminar primero todos los archivos que estaban en el archivo y luego los directorios que quedan vacíos.
sort -r
(se sugiere glennjackman entac
lugar desort -r
en los comentarios a la respuesta aceptada, que también funciona ya quetar
el resultado es lo suficientemente regular) es necesario eliminar primero los directorios más profundos; de lo contrario, un caso dondedir1
contiene un único directorio vacíodir2
se dejarádir1
después delrmdir
pase, ya que no estaba vacío antes de quedir2
se eliminara.Esto generará una gran cantidad de
y
Cállate con esto
2>/dev/null
si te molesta, pero preferiría mantener tanta información sobre el proceso como sea posible.Y no lo haga hasta que esté seguro de que coincide con los archivos correctos. Y tal vez intente
rm -i
confirmar todo. Y tener refuerzos, desayunar, cepillarse los dientes, etc.fuente
-d'\n'
opción axargs
.xargs
no tiene-d
, por lo que necesita la variante GNU si es un alma pobre como yo.Enumere el contenido del archivo tar de la siguiente manera:
Luego, elimine esos nombres de archivo iterando sobre esa lista:
Esto seguirá enumerando los archivos que se eliminarán. Reemplace
echo
conrm
si está realmente seguro de que estos son los que desea eliminar. Y tal vez haga una copia de seguridad para estar seguro.En una segunda pasada, elimine los directorios que quedan:
Esto evita que los directorios se eliminen si ya existían antes.
Otro buen truco de @glennjackman, que conserva el orden de los archivos, comenzando por los más profundos. Nuevamente, retírelo
echo
cuando haya terminado.Esto podría ser seguido por la
rmdir
limpieza normal .fuente
while
un ciclo sobre un conjunto de registros. Me acabo de acostumbrar. @ stérm -rf
podría eliminar archivos que no eran del archivo sino dentro de un directorio que tiene el mismo nombre que uno del archivo. Es mejor tener cuidado aquí y usarrmdir
en un segundo pase.rmdir
debe ejecutarse para cada nivel de anidamiento de directorios. Por lo tanto, se limpiarásubdir1
en la primera pasada, pero abandonedir1
ya que intentó eliminar esto primero cuando no estaba vacío en ese momento. Este comando podría ejecutarse una vez si la lista de archivos se puede ordenar en reversa.tar tvf arch.tar | tac | xargs echo rm
(elimine el eco cuando esté seguro)Aquí hay una posibilidad que tomará los archivos extraídos y los moverá a un subdirectorio, limpiando su carpeta principal.
Guarde esto en el archivo
fix-tar.pl
y luego ejecútelo así:Esto confirmará que su
tar
lista es como la mía. Deberías obtener resultados como:Si eso se ve bien, ejecútelo nuevamente así:
El
fixup.sh
script serán los comandos de shell que moverán los archivos y directorios de nivel superior a una carpeta "limpia" (en este caso, la carpeta llamadacleanup
). Eche un vistazo a este script para confirmar que todo es kosher. Si es así, ahora puedes limpiar tu desorden con:Prefiero este tipo de limpieza porque no destruye nada que no haya sido destruido al ser sobrescrito por esa inicial
tar xv
.Nota: si esa salida inicial de ejecución en seco no se ve bien, debería poder manipular los números en las dos
substr
llamadas de función hasta que se vean correctamente. La$perms
variable se usa solo para la ejecución en seco, por lo que realmente solo la$dirent
subcadena debe ser adecuada.Otra cosa: es posible que deba usar la
tar
opción--numeric-owner
si los nombres de usuario y / o nombres de grupo en latar
lista hacen que los nombres comiencen en una columna impredecible.fuente
Ese tipo de archivo (antisocial) se llama bomba de alquitrán debido a lo que hace. Una vez que uno de estos "explota" en usted, las soluciones en las otras respuestas son mucho mejores de lo que hubiera sugerido.
Sin embargo, la mejor "solución" es prevenir el problema en primer lugar.
La forma más fácil (más perezosa) de hacerlo es siempre descomprimir un archivo tar en un directorio vacío. Si incluye un directorio de nivel superior, simplemente lo mueve al destino deseado. Si no, simplemente cambie el nombre de su directorio de trabajo (el que estaba vacío) y muévalo a la ubicación deseada.
Si solo quiere hacerlo bien la primera vez, puede ejecutar tar -tvf archive-file.tar | menos y enumerará el contenido del archivo para que pueda ver cómo está estructurado y luego hacer lo necesario para extraerlo a la ubicación deseada para comenzar.
La opción t también es útil si desea inspeccionar el contenido de un archivo solo para ver si tiene algo que está buscando. Si lo hace, puede, opcionalmente, simplemente extraer los archivos que desee.
fuente