Можно генерировать список файлов в архиве и удалить их, хотя это раздражающе трудно с archivers те, которые разархивировали или 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 для управления архивами с помощью обычных команд файловой системы.
Можно использовать zip Предохранителя, чтобы посмотреть в 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
определить подходящее время сокращения. Если Вы хотите удостовериться, что не удалили zip, нет никакой причины сделать любое ручное одобрение: 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
если это в порядке).
#!/bin/bash
# Minutes since Epoch until now:
((minutes=$(date +%s)/60))
# Minutes since Epoch until Jan 1 2011:
((minutes=$(date -d 'Jan 1 2011' +%s)/60))
Если Вам установили Python затем, можно выполнить это:
python -c "import time; print time.time() / 60"
Можно проверить интерактивную версию Эпохи Unix: Преобразователь Эпохи. Можно получить текущее значение Эпохи и также преобразовать время назад в эпоху
%s
вdate +%s
расширение GNU. Другие реализации обычно позволяют те же строки формата как вstrftime(3)
, которые главным образом не имеют%s
. И ПОЧЕМУ все принимаютbash
доступность? – MattBianco 31.03.2011, 09:41info date
... %s "... Секунды прыжка не считаются, если прыжок вторая поддержка не доступен".... %S, "второй ('00'... 60'). Это может быть '60', если секунды прыжка поддерживаются".... Я могу только предположить, что это включало бы в те секунды в в общей сложности 'секундах начиная с эпохи', когда поддержка доступна. – Peter.O 31.03.2011, 19:20%s
доступно в BSD'sdate
даже при том, что в целом это значительно команда, чем GNUdate
. – nix 01.04.2011, 17:53