GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo descomprimir, destar -xvf — Desarchivar en una carpeta desordenada?

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?

  1. $ 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.

  2. Si la cantidad de archivos extraídos es pequeña, uno por uno, lento, engorroso y propenso a errores.

  3. 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).

Relacionado:Windows:¿carpeta compartida entre el invitado de QEMU Windows y el host de Linux?
Linux
  1. Cómo usar Descomprimir en Linux

  2. ¿Cómo puedo encontrar todas las extensiones de archivo distintas en una jerarquía de carpetas?

  3. ¿Cómo puedo crear un archivo en cada carpeta?

  4. Cómo duplicar una carpeta exactamente

  5. ¿Cómo hago para que find excluya la carpeta en la que busca?

Cómo encontrar la dirección IP en Linux

Cómo encontrar el nombre de host en Linux

Cómo comprimir archivos y carpetas en Linux [Consejo para principiantes]

Cómo comprimir una carpeta en Linux

Cómo comprimir archivos y carpetas en Linux

Cómo encontrar archivos en Debian