Если вы извлекли файлы таким образом, что метка времени изменения в архиве не сохраняется в извлеченных копиях (а извлеченные файлы имеют свое обычное время модификации), то правильный способ атаковать это - через время модификации. Все извлеченные файлы имеют более новую метку времени изменения, чем последний измененный существующий файл в этом каталоге.
Вот простая ситуация.
Предположим, что ни один из существующих файлов в текущем каталоге не был затронут в течение как минимум 24 часов. Поэтому все, что было изменено за последние 24 часа, является ненужным из zipfile.
$ find . -mtime -1 -print0 | xargs -0 rm
Это также найдет некоторые каталоги, но rm
оставит их в покое. С ними можно разобраться во втором проходе:
$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir
Любые каталоги, которые были недавно изменены, были изменены почтовым индексом. Если rmdir
успешно удаляет их, это означает, что они пусты. Пустые каталоги, которые были затронуты zip, вероятно, были созданы им: т.е. пришли из архива. Мы не можем быть на 100% уверены. Возможно, что задание распаковки поместило некоторые файлы в существующий каталог, который был пустым.
Если find
24-часовая детализация недостаточно хороша для задания, поскольку файлы в дереве были изменены слишком недавно, то я бы затем подумал о чем-то простом: предположим, что задание распаковки ничего не помещало в существующие подкаталоги. То есть, все, что было распаковано, - это либо файл на верхнем уровне, либо новый подкаталог, которого раньше не было, который поэтому содержит только материал из zip-архива. Затем:
# list directory in descending order of modification time
$ ls -1t > filelist # descending order of modification time
Теперь мы открываем filelist
в текстовом редакторе и определяем первую запись в списке, которая не пришла из zip. Мы удаляем эту запись и все остальное после нее. То, что осталось, это файлы и каталоги, которые пришли из zip. Сначала мы визуально проверяем наличие проблем, таких как пробелы в именах, и вхождение кавычек, которые необходимо экранировать. Затем мы можем добавить кавычки вокруг всего, если необходимо: следующее предполагает, что вы используете Vim:
:%s/.*/"&"/
Затем объедините все это в большую строку:
:%j
Теперь вставьте rm -rf
перед ним:
Irm - rf<ESC>
Запустите строку под курсором как команду оболочки:
!!sh<Enter>
Определенно, я бы не стал автоматизировать шаги этой задачи из-за риска стирания файлов, которые уже были там, или из-за проблем с именами файлов.
Если вы собираетесь пойти очевидным путем получения списка путей в zip-архиве, запишите его в файл, внимательно его просмотрите и преобразуйте в удаление после выполнения любого необходимого редактирования.
lq
вариантовunzizp
, я просто добавил несколько классических * nix трюков вокруг его основного ответа.