Por lo general, desarchivo las cosas mediante $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
pero a veces me da pereza y simplemente lo hago en una carpeta arbitraria $ unzip *.zip
así que de vez en cuando se mete 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 las últimas.
Algunas formas de desarchivar, ¿hay otras?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
Las debilidades son que enumera el*.zip
dirs, por lo que debe usar lento-ok
, lento con muchos*.zip
coincide y, por alguna razón, no parece coincidir con todo lo extraído. -
Si la cantidad de archivos extraídos es pequeña, uno por uno, lento, engorroso y propenso a errores.
-
Cuando quiero asegurarme de que el contenido del archivo es realmente una carpeta, a veces lo compruebo con
$ 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 las FORMAS en que lo hace, en lugar de una sola herramienta.
Respuesta aceptada:
Por nombre
Puede generar la lista de archivos en el archivo y eliminarlos, aunque esto es molesto y complicado con archivadores como unzip o 7z que no tienen una opción para generar una lista simple de nombres de archivo. Incluso con tar, esto supone que no hay saltos de línea en los nombres de los archivos.
tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
p && /^ --/ {p=2}
p==1 {print substr($0, 29)}
/^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while … # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while … # works on tar.*, zip, 7z and more
En lugar de eliminar los archivos, puede moverlos a su destino previsto.
tar tf foo.tar | while read -r file; do
if [ -d "$file" ]; then continue; fi
mkdir -p "/intended/destination/${file%/*}"
mv -- "$file" "/intended/destination/$file"
done
Uso de FUSIBLE
En lugar de depender de herramientas externas, puede (en la mayoría de los dispositivos) usar FUSE para manipular archivos utilizando comandos ordinarios del sistema de archivos.
Puede usar Fuse-zip para echar un vistazo a un zip, extráigalo con cp
, enumera su contenido con find
, etc.
mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d
AVFS crea una vista de toda la jerarquía de directorios donde todos los archivos tienen un directorio asociado (el mismo nombre con # agregado al final) que parece contener el contenido del archivo.
mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs
Por fecha
Suponiendo que no haya habido ninguna otra actividad en la misma jerarquía que su extracción, puede identificar los archivos extraídos por su reciente ctime . Si acaba de crear o mover el archivo zip, puede usarlo como corte; de lo contrario, use ls -lctr
para determinar un tiempo de corte adecuado. Si desea asegurarse de no quitar los zips, no hay razón para realizar ninguna aprobación manual:find
es perfectamente capaz de excluirlos. Aquí hay comandos de ejemplo usando zsh o find
; tenga en cuenta que -cmin
y -cnewer
los primarios no están en POSIX pero existen en Linux (y otros sistemas con GNU find), *BSD y OSX.
find . ! -name '*.zip' -type f -cmin -5 -exec rm {} + # extracted <5 min ago
rm **/*~*.zip(.cm-6) # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} + # created or moved after foo.zip
Con GNU find, FreeBSD y OSX, otra forma de especificar el tiempo de corte es crear un archivo y usar touch
para configurar su mtime a la hora de corte.
touch -d … cutoff
find . -type f -newercm cutoff -delete
En lugar de eliminar los archivos, puede moverlos a su destino previsto. Aquí hay una forma con GNU/*BSD/OSX find, creando directorios en el destino según sea necesario.
find . ! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Equivalente a Zsh (casi:este reproduce toda la jerarquía de directorios, no solo los directorios que contendrán archivos):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Advertencia, no he probado la mayoría de los comandos en esta respuesta. Siempre revise la lista de archivos antes de eliminarlos (ejecute echo
primero, luego rm
si está bien).