Обычно я разархивирую вещи, $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
но иногда я ленюсь и просто делаю их в произвольной папке, $ unzip *.zip
поэтому время от времени путаюсь с другим контентом. Я перечислю здесь некоторые методы - некоторые архивные версии, несомненно, имеют флаги-дерьмо, в то время как другие более спартанские, меня больше интересует последнее.
Некоторые способы деархивировать, есть другие?
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;
Недостатки в том, что в нем перечислены*.zip
каталоги, поэтому вам нужно использовать медленный-ok
, медленный со многими*.zip
совпадениями и, по какой-то причине, он не соответствует всему извлеченному.Если небольшое количество извлеченных файлов, один за другим, медленно, громоздко и подвержено ошибкам.
Когда я хочу убедиться, что содержимое архива действительно является папкой, я иногда проверяю его
$ unzip -l *.bsd
, работает по крайней мере в unzip-версии obsd.
Если вы имеете в виду определенные инструменты архивации, укажите их, когда это необходимо. Проще говоря, меня больше интересует ПУТИ, как вы это делаете, а не один инструмент.
источник
mkdir; unzip
вещей, поэтому мне никогда не лень это делать! svn.mikelward.com/svn/scripts/untarОтветы:
По имени
Вы можете сгенерировать список файлов в архиве и удалить их, хотя это раздражает, если использовать такие архиваторы, как unzip или 7z, у которых нет возможности создать простой список имен файлов. Даже при использовании tar предполагается, что в именах файлов нет новых строк.
Вместо удаления файлов вы можете переместить их по назначению.
Использование FUSE
Вместо того, чтобы зависеть от внешних инструментов, вы можете (на большинстве устройств) использовать FUSE для управления архивами с помощью обычных команд файловой системы.
Вы можете использовать Fuse-zip, чтобы посмотреть в zip-архив, распаковать его
cp
, просмотреть его содержимоеfind
и т. Д.AVFS создает представление всей вашей иерархии каталогов, в котором все архивы имеют связанный каталог (с тем же именем, в конце которого стоит # tacked ), который, по-видимому, содержит содержимое архива.
По дате
Предполагая, что в той же иерархии, что и ваше извлечение, не было других действий, вы можете указать извлеченные файлы по их последнему времени ctime . Если вы только что создали или переместили zip-файл, вы можете использовать его как обрезку; в противном случае используйте
ls -lctr
для определения подходящего времени отключения. Если вы хотите убедиться, что молнии не сняты, нет никаких оснований для ручного одобрения: ониfind
вполне могут их исключить. Вот примеры команд, использующих zsh илиfind
; Следует отметить , что-cmin
и-cnewer
праймериз не в POSIX , но существуют на Linux (и других систем с GNU находке), * BSD и OSX.В GNU find, FreeBSD и OSX еще один способ указать время отсечения - создать файл и использовать его
touch
для установки в mtime времени отсечения.Вместо удаления файлов вы можете переместить их по назначению. Вот способ GNU / * BSD / OSX найти, создавая каталоги в месте назначения по мере необходимости.
Эквивалент Zsh (почти: он воспроизводит всю иерархию каталогов, а не только каталоги, которые будут содержать файлы):
Предупреждение, я не проверял большинство команд в этом ответе. Всегда просматривайте список файлов перед удалением (
echo
сначала запустите , затем,rm
если все в порядке).источник
Я чувствую себя глупо, в любом случае я почесал голову, чтобы написать этот сценарий, когда у меня была похожая проблема. Я использовал
cpio
с-it
флагом, чтобы получить список файлов; Вы можете использовать эквивалентные команды для других архиваторов. Сложность в том, что архив cpio создан из initrd, и я извлек его в него/
, поэтому многие папки и файлы имеют то же имя, что и в рабочей системе. К счастью, cpio не перезаписал ни один из моих существующих файлов. Я использую проверку времени, чтобы не удалять ничего, что существовало до неправильной команды.источник
Как насчет подачи списка файлов в архиве в
xargs rm
?Это было бы
tar -tf tarbomb.tar | xargs rm
илиunzip --list zipbomb.zip | xargs rm
.источник
xargs
ожидает, что его вклад процитирован особым образом,find
который не производит. Используйтеxargs -I rm {}
так, чтобы xargs обрабатывал по одному элементу в строке. Для команды unzip какая у вас реализация? У меня (Debian / Ubuntu) нет--list
, только-l
, и он не просто печатает имена файлов, поэтому необходима дополнительная обработка.find
. 3) вы правыunzip
, я не проверял, и, кажется, нет возможности для недекорированных списков. Нет и--list
на моей Ubuntu - я просто не тестировал.tar -t
наfind
. Но мои другие пункты стоят. Существует реальный риск того, что ваша команда, как указано, удалит несвязанный файл.tar -tf tarbomb.tar
будет печатать имена файлов по одному в строке, чтобы вы могли сделатьtar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; done
или подобное.Не совсем то, что вы просили, но как насчет использования сценария «unzip all» вместо.
Таким образом, выходные данные каждого файла попадают в его собственную директорию.
источник
Я использую следующую функцию в Zsh:
Т.е. подстановка команды для удаления всех файлов в очищенном выводе
unzip -l
.tar tvf
может быть использован аналогичным образом.источник