Por lo general, desarchivo las cosas, $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
pero a veces me vuelvo vago y solo lo hago en una carpeta arbitraria, $ unzip *.zip
así que de vez en cuando me equivoco con otro contenido. Enumeraré aquí algunos métodos: algunas versiones de archivo seguramente tienen banderas malas, mientras que otras son más espartanas, estoy más interesado en lo último.
Algunas formas de desarchivar, ¿hay otras?
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;
Las debilidades son que enumera los*.zip
directorios, por lo que debe usar slow-ok
, slow con muchas*.zip
coincidencias y, por alguna razón, no parece coincidir con todo lo extraído.Si es una pequeña cantidad de archivos extraídos, uno por uno, lento, engorroso y propenso a errores.
Cuando quiero asegurarme de si el contenido del archivo es realmente una carpeta, a veces lo compruebo
$ unzip -l *.bsd
, funciona al menos en la versión descomprimida de obsd.
Si se refiere a ciertas herramientas de archivo, indíquelas cuando corresponda. Sin embargo, manténgalo simple: estoy más interesado en la forma en que lo hace, en lugar de una sola herramienta.
fuente
mkdir; unzip
cosas, ¡así que nunca soy demasiado flojo para hacerlo! svn.mikelward.com/svn/scripts/untarRespuestas:
Por nombre
Puede generar la lista de archivos en el archivo y eliminarlos, aunque esto es molestamente complicado con archivadores como descomprimir o 7z que no tienen una opción para generar una lista simple de nombres de archivo. Incluso con alquitrán, esto supone que no hay nuevas líneas en los nombres de archivo.
En lugar de eliminar los archivos, puede moverlos a su destino previsto.
Usando FUSE
En lugar de depender de herramientas externas, puede (en la mayoría de los dispositivos) usar FUSE para manipular archivos usando comandos comunes del sistema de archivos.
Puede usar Fuse-zip para mirar dentro de un zip, extraerlo
cp
, enumerar su contenidofind
, etc.AVFS crea una vista de toda la jerarquía de directorios donde todos los archivos tienen un directorio asociado (el mismo nombre con # al final) que parece contener el contenido del archivo.
Por fecha
Suponiendo que no haya habido ninguna otra actividad en la misma jerarquía que su extracción, puede ver los archivos extraídos por su ctime reciente . Si acaba de crear o mover el archivo zip, puede usarlo como punto de corte; de lo contrario, use
ls -lctr
para determinar un tiempo de corte adecuado. Si desea asegurarse de no quitar las cremalleras, no hay razón para hacer ninguna aprobación manual:find
es perfectamente capaz de excluirlas. Aquí hay ejemplos de comandos que usan zsh ofind
; tenga en cuenta que los primarios-cmin
y-cnewer
no están en POSIX pero existen en Linux (y otros sistemas con GNU find), * BSD y OSX.Con GNU find, FreeBSD y OSX, otra forma de especificar el tiempo de corte es crear un archivo y usarlo
touch
para establecer su tiempo m al tiempo de corte.En lugar de eliminar los archivos, puede moverlos a su destino previsto. Aquí hay una manera de encontrar GNU / * BSD / OSX, creando directorios en el destino según sea necesario.
Equivalente a Zsh (casi: este reproduce toda la jerarquía de directorios, no solo los directorios que contendrán archivos):
Advertencia, no he probado la mayoría de los comandos en esta respuesta. Siempre revise la lista de archivos antes de eliminar (ejecute
echo
primero, luegorm
si está bien).fuente
Me siento estúpido, de todos modos me rasqué la cabeza para escribir este guión cuando tuve un problema similar. Solía
cpio
con la-it
bandera para obtener una lista de archivos; puede usar comandos equivalentes para otros archivadores. La parte difícil es que el archivo cpio es de un initrd y lo extraje/
, por lo que muchas carpetas y archivos tienen el mismo nombre que en un sistema de trabajo. Afortunadamente, cpio no sobrescribió ninguno de mis archivos existentes. Utilizo una verificación de tiempo para asegurarme de no eliminar nada de lo que existía antes del comando incorrecto.fuente
¿Qué tal alimentar la lista de archivos en el archivo
xargs rm
?Eso sería
tar -tf tarbomb.tar | xargs rm
ounzip --list zipbomb.zip | xargs rm
.fuente
xargs
espera su entrada citada de una manera peculiar quefind
no produce. Usexargs -I rm {}
para que xargs procese un artículo por línea en su lugar. Para el comando descomprimir, ¿qué implementación tienes? El mío (Debian / Ubuntu) no--list
solo tiene-l
, y no solo imprime nombres de archivos, por lo que se necesita un procesamiento adicional.find
. 3) estás en lo correctounzip
, no probé y parece que no hay opción para una lista sin decoración. No--list
en mi Ubuntu también, simplemente no probé.tar -t
afind
. Pero mis otros puntos se mantienen. Existe un riesgo real de que su comando tal como se borre elimine un archivo no relacionado.tar -tf tarbomb.tar
imprimirá los nombres de archivo uno por línea, por lo que podría hacertar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; done
o similar.No es realmente lo que pediste, pero ¿qué tal si usas un script "descomprimir todo" en lugar de?
De esa manera, la salida de cada archivo va a su propio directorio.
fuente
Yo uso la siguiente función en zsh:
Es decir, la sustitución de comandos para eliminar todos los archivos en la salida limpia de
unzip -l
.tar tvf
podría usarse de manera similar.fuente