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 echodespués xargs.

xargs(entaclugar desort -rsolo 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 dicexargsque divida los argumentos en nuevas líneas (que es lo que está alimentando) pero en espacios, entonces un archivo con el el nombrefolder1/some filese leerá comofolder1/someyname.Respuestas:
enumerará los contenidos línea por línea.
Esto se puede canalizar
xargsdirectamente, pero tenga cuidado : elimine con mucho cuidado. ¡ No desea simplementerm -rtodo lo quetar tfle 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 entaclugar desort -ren los comentarios a la respuesta aceptada, que también funciona ya quetarel resultado es lo suficientemente regular) es necesario eliminar primero los directorios más profundos; de lo contrario, un caso dondedir1contiene un único directorio vacíodir2se dejarádir1después delrmdirpase, ya que no estaba vacío antes de quedir2se eliminara.Esto generará una gran cantidad de
y
Cállate con esto
2>/dev/nullsi 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 -iconfirmar todo. Y tener refuerzos, desayunar, cepillarse los dientes, etc.fuente
-d'\n'opción axargs.xargsno 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
echoconrmsi 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
echocuando haya terminado.Esto podría ser seguido por la
rmdirlimpieza normal .fuente
whileun ciclo sobre un conjunto de registros. Me acabo de acostumbrar. @ stérm -rfpodrí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 usarrmdiren un segundo pase.rmdirdebe ejecutarse para cada nivel de anidamiento de directorios. Por lo tanto, se limpiarásubdir1en la primera pasada, pero abandonedir1ya 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.ply luego ejecútelo así:Esto confirmará que su
tarlista es como la mía. Deberías obtener resultados como:Si eso se ve bien, ejecútelo nuevamente así:
El
fixup.shscript 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
substrllamadas de función hasta que se vean correctamente. La$permsvariable se usa solo para la ejecución en seco, por lo que realmente solo la$direntsubcadena debe ser adecuada.Otra cosa: es posible que deba usar la
taropción--numeric-ownersi los nombres de usuario y / o nombres de grupo en latarlista 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