Я извлек zip-файл в непустую папку. Zip-файл содержит множество файлов и глубокую иерархию, которые объединены с существующим деревом целевого каталога. Как я могу удалить файлы и каталоги, которые были созданы, разархивировав файлы, не разрушая уже существующие файлы и каталоги? Конечно, у меня все еще есть zip-файл, который я слил, поэтому информация там.
52
lq
вариантовunzizp
, я просто добавил несколько классических * nix трюков вокруг его основного ответа.foo.tds.zip
форме. Эти молнии сливаются в дерево TEXMF, что очень удобно. Но если вы когда-нибудь захотите удалить такой пакет, вы столкнетесь с проблемой, которую я описал.Ответы:
Ответ JJLIN - путь. Я просто хочу добавить несколько вариантов для каталогов:
Удалить все извлеченные файлы, без каталогов :
Удалить только извлеченные файлы и пустые каталоги
Без параметров
rmdir
удаляет только пустые каталоги, он оставляет файлы и непустые папки в одиночестве, чтобы вы могли безопасно запускать его*
.Удалите все извлеченное, но запрашивайте подтверждение перед каждым удалением:
-i
Флаг будет вызыватьrm
к строке перед каждым удалением, вы можете выбрать Да или НетУдалить все извлеченные, включая каталоги:
источник
find
:find * -depth -type d -exec rmdir {} +
и игнорировать всеDirectory not empty
сообщения. Это может быть законно, чтобы сократить это доfind * -type d -delete
включения-delete
опции,-depth
но я не проверил, что-delete
не удалит непустой каталог.find: cannot delete './foo': Directory not empty
Вы можете использовать
unzip -lqq <filename.zip>
для просмотра содержимого zip-файла; это будет включать некоторую постороннюю информацию, которую вам нужно будет отфильтровать. Вот команда, которая работает для меня:Команда
awk
извлекает только имена файлов и каталогов. Затем результат передается,xargs
чтобы удалить все. Я предлагаю сначала выполнить пробный прогон команды (то есть, пропустивxargs rm -rf
часть), чтобы убедиться, что результаты верны.Приведенная выше команда будет иметь проблемы с путями, которые имеют пробелы. Эта (более сложная) версия должна исправить это:
источник
unzip -lqq
перечисляет также каталоги, содержащиеся в zip. Сейчас я бы оставил все каталоги в покое. Как удалить все пустые каталоги в дереве, может быть последующим вопросом.grep -v '/$'
в конвейер, чтобы пропустить удаление каталогов (у которых есть косая черта, AFAICT).awk
, так как печать всего за 4 доллара не напечатает полный путь.-r
опцию rm: кажется, что возникают проблемы, особенно в сочетании с-f
опцией. Я бы не стал использовать эту-f
опцию вообще в этом сценарии.grep -v '/$'
пропустит только записи каталога в ZIP-файле. Они по-прежнему будут содержать записи, которые были простыми файлами в ZIP-файле, но были уже существующими каталогами в целевой папке. По этой причине было бы разумно опустить это-r
С переключателем
-Z1
unzip будет перечислять ровно один файл в строке (и ничего больше).Таким образом, вы можете использовать
удалить все файлы, извлеченные из ZIP-файла.
Команда
также удалит каталоги, но вы должны быть осторожны. Если каталоги уже существовали до распаковки zip-файла, все существующие в этих каталогах файлы также будут удалены.
Если вы все равно собираетесь повторно извлечь zip-файл, есть другой подход, который гарантированно справится со странными именами файлов.
Сначала распакуйте zip-файл, где вы изначально хотели его распаковать:
Теперь перейдите в каталог, в который вы по ошибке извлекли файлы, и выполните следующую команду:
-type f
только находит файлы (без каталогов).%P\0
это относительный путь (безelsewhere/
), за которым следует нулевой символ.-0
делает XARGS отдельными строками с нулевыми символами. Это более надежно, поскольку в теории имена файлов могут содержать символы новой строки.Для работы с оставшимися каталогами вы можете выполнить команду:
-type d
только находит каталоги.-exec rmdir -p {} \;
выполняетсяrmdir -p {}
для каждого каталога, который был найден.{}
это каталог, который был найден, и-p
переключатель заставляет rmdir также удалить свои пустые родительские каталоги.2> /dev/null
подавляет сообщения об ошибках, которые возникают при попытке удаления непустых или ранее удаленных каталогов.Связанные справочные страницы:
источник
zipinfo
страницу справочника.Вот еще более простое и безопасное (я думаю) решение
Что это делает: команда unzip с кавычками выдаст список того, что было в вашем исходном файле.
Затем zip -m будет использовать этот список, чтобы добавить add для каждого в getmeoutofhere.zip и удалить его из исходного каталога (поэтому теоретически он должен быть независим от myoriginalfile.zip.
Недостатком является то, что unzip -lqq создаст дополнительный текст, даты, время, размер файла и т. Д. Это приведет к тому, что zip -m выдаст сообщения об ошибках, но это не должно иметь никакого влияния (если только у вас нет маловероятного случая файла с таким же имя).
Обратите внимание, что это не приведет к удалению любых каталогов, которые были созданы во время первоначального распаковки.
источник
Если вы извлекли файлы таким образом, что метка времени изменения в архиве не сохраняется в извлеченных копиях (а извлеченные файлы имеют свое обычное время модификации), то правильный способ атаковать это - через время модификации. Все извлеченные файлы имеют более новую метку времени изменения, чем последний измененный существующий файл в этом каталоге.
Вот простая ситуация.
Предположим, что ни один из существующих файлов в текущем каталоге не был затронут в течение как минимум 24 часов. Поэтому все, что было изменено за последние 24 часа, является ненужным из zipfile.
Это также найдет некоторые каталоги, но
rm
оставит их в покое. С ними можно разобраться во втором проходе:Любые каталоги, которые были недавно изменены, были изменены почтовым индексом. Если
rmdir
успешно удаляет их, это означает, что они пусты. Пустые каталоги, которые были затронуты zip, вероятно, были созданы им: т.е. пришли из архива. Мы не можем быть на 100% уверены. Возможно, что задание распаковки поместило некоторые файлы в существующий каталог, который был пустым.Если
find
24-часовая детализация недостаточно хороша для задания, поскольку файлы в дереве были изменены слишком недавно, то я бы затем подумал о чем-то простом: предположим, что задание распаковки ничего не помещало в существующие подкаталоги. То есть, все, что было распаковано, - это либо файл на верхнем уровне, либо новый подкаталог, которого раньше не было, который поэтому содержит только материал из zip-архива. Затем:Теперь мы открываем
filelist
в текстовом редакторе и определяем первую запись в списке, которая не пришла из zip. Мы удаляем эту запись и все остальное после нее. То, что осталось, это файлы и каталоги, которые пришли из zip. Сначала мы визуально проверяем наличие проблем, таких как пробелы в именах, и вхождение кавычек, которые необходимо экранировать. Затем мы можем добавить кавычки вокруг всего, если необходимо: следующее предполагает, что вы используете Vim:Затем объедините все это в большую строку:
Теперь вставьте
rm -rf
перед ним:Запустите строку под курсором как команду оболочки:
Определенно, я бы не стал автоматизировать шаги этой задачи из-за риска стирания файлов, которые уже были там, или из-за проблем с именами файлов.
Если вы собираетесь пойти очевидным путем получения списка путей в zip-архиве, запишите его в файл, внимательно его просмотрите и преобразуйте в удаление после выполнения любого необходимого редактирования.
источник