Если вы извлекли файлы таким образом, что метка времени изменения в архиве не сохраняется в извлеченных копиях (а извлеченные файлы имеют свое обычное время модификации), то правильный способ атаковать это - через время модификации. Все извлеченные файлы имеют более новую метку времени изменения, чем последний измененный существующий файл в этом каталоге.
Вот простая ситуация.
Предположим, что ни один из существующих файлов в текущем каталоге не был затронут в течение как минимум 24 часов. Поэтому все, что было изменено за последние 24 часа, является ненужным из zipfile.
$ find . -mtime -1 -print0 | xargs -0 rm
Это также найдет некоторые каталоги, но rmоставит их в покое. С ними можно разобраться во втором проходе:
$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir
Любые каталоги, которые были недавно изменены, были изменены почтовым индексом. Если rmdirуспешно удаляет их, это означает, что они пусты. Пустые каталоги, которые были затронуты zip, вероятно, были созданы им: т.е. пришли из архива. Мы не можем быть на 100% уверены. Возможно, что задание распаковки поместило некоторые файлы в существующий каталог, который был пустым.
Если find24-часовая детализация недостаточно хороша для задания, поскольку файлы в дереве были изменены слишком недавно, то я бы затем подумал о чем-то простом: предположим, что задание распаковки ничего не помещало в существующие подкаталоги. То есть, все, что было распаковано, - это либо файл на верхнем уровне, либо новый подкаталог, которого раньше не было, который поэтому содержит только материал из 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 трюков вокруг его основного ответа.