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.
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
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 contenido 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 # 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 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 o find
; 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.
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 usarlo touch
para establecer su tiempo m al tiempo 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 manera de encontrar GNU / * BSD / OSX, 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 eliminar (ejecute echo
primero, luego rm
si está bien).