По імені
Ви можете генерувати список файлів в архіві та видаляти їх, хоча це дратує навпаки архіваторів, таких як unzip або 7z, у яких немає можливості генерувати звичайний список імен файлів. Навіть з tar, це передбачає, що в іменах файлів немає нових рядків.
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
Замість того, щоб видаляти файли, ви можете перемістити їх за призначенням.
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
Використання FUSE
Замість того, щоб залежати від зовнішніх інструментів, ви можете (на більшості об'єктів) використовувати FUSE для маніпулювання архівами за допомогою звичайних команд файлової системи.
Ви можете використовувати Fuse-zip, щоб зазирнути у блискавку, витягнути її cp
, перелічити її вміст find
тощо.
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 створює перегляд всієї ієрархії каталогів, де всі архіви мають пов'язаний каталог (те саме ім'я з # позначено в кінці), який, як видається, містить вміст архіву.
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
За датою
Якщо припустити , що не було іншої якої - небудь діяльності в тій же ієрархії , ніж ваш екстрагування, ви можете сказати , розпаковані файли їх недавнім CTime . Якщо ви тільки що створили або перемістили zip-файл, ви можете використовувати його як обрізання; в іншому випадку використовуйте ls -lctr
для визначення відповідного часу відсічення. Якщо ви хочете переконатись, що не знімати блискавки, немає ніяких причин робити будь-яке затвердження вручну: find
цілком здатне їх виключити. Ось приклади команд, що використовують zsh або find
; зауважте, що -cmin
і -cnewer
праймери не в POSIX, але існують на Linux (та інших системах з GNU знайти), * BSD та 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
За допомогою пошуку GNU, FreeBSD та OSX, інший спосіб визначити час відсікання - створити файл і використовувати touch
для встановлення його mtime на час відсічення.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Замість того, щоб видаляти файли, ви можете перемістити їх за призначенням. Ось спосіб пошуку GNU / * BSD / OSX, створення необхідних каталогів за призначенням.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Zsh еквівалент (майже: цей відтворює всю ієрархію каталогів, а не лише каталоги, які містять файли):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Попередження, я не перевірив більшість команд у цій відповіді. Завжди переглядайте список файлів перед видаленням (запустіть echo
спочатку, потім, rm
якщо це нормально).