Я просто распаковал архив, который создал беспорядок в моем аккуратном каталоге. Например:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Я ожидал, что файл tar будет организован в одной папке (т.е. myarchive/
), но это не так! Теперь у меня есть около 190 файлов и каталогов, которые в цифровом виде оказались в том, что было организованным каталогом. Эти неиспользуемые файлы должны быть очищены.
Есть ли способ «отменить» это и удалить файлы и каталоги, которые были извлечены из этого архива?
Спасибо за отличные ответы ниже. Таким образом , вот что работает с двумя шагами (1) удаление файлов и (2) удаление пустой структуры каталогов в обратном порядке упаковки (чтобы сначала удалить внешние каталоги):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
И еще безопаснее - предварительно просмотреть пробные команды, добавив их echo
после xargs
.
xargs
(tac
аsort -r
не просто косметику), но вы принимаете ответ с заменой процесса, который, как вы объяснили в комментариях, вам не подходит? Кроме того, укажитеxargs -d'\n'
в своем сообщении, если вы хотите подвести итоги для будущих пользователей, чтобы они не были укушены пробелами в именах файлов.-d'\n'
до сих пор, и после дальнейшего анализа ваш ответ на самом деле ближе к тому, что я использовал.-d'\n'
заключается в том факте, что если вы не скажетеxargs
разделять аргументы по новым строкам (что вы и вводите), а по пробелам, то файл с имяfolder1/some file
будет читаться какfolder1/some
иname
.Ответы:
будет перечислять содержимое построчно.
Это может быть передано
xargs
напрямую, но будьте осторожны : делайте удаление очень осторожно. Вы не хотите простоrm -r
все, чтоtar tf
вам говорит, поскольку это может включать в себя каталоги, которые не были пустыми перед распаковкой!Вы могли бы сделать
сначала удалить все файлы, которые были в архиве, а затем каталоги, которые остались пустыми.
sort -r
(предложил glennjackmantac
вместо того, чтобыsort -r
в комментариях к принятому ответу, который также работает, посколькуtar
выходные данные достаточно регулярны) необходимо сначала удалить самые глубокие каталоги; в противном случае случай, в которомdir1
содержится один пустой каталог,dir2
будет удаленdir1
послеrmdir
передачи, поскольку он не был пустым доdir2
удаления.Это создаст много
а также
Заткнись,
2>/dev/null
если это тебя раздражает, но я бы предпочел сохранить как можно больше информации о процессе.И не делайте этого до тех пор, пока вы не будете уверены, что вы подбираете нужные файлы. И, возможно, попытаться
rm -i
подтвердить все. И делать резервные копии, есть свой завтрак, чистить зубы и т. Д.источник
-d'\n'
вариантxargs
.xargs
не имеет-d
, поэтому вам нужен вариант GNU, если вы бедная душа, как я.Перечислите содержимое файла tar следующим образом:
Затем удалите эти имена файлов, повторяя этот список:
Это по-прежнему будет просто список файлов, которые будут удалены. Замените
echo
на,rm
если вы действительно уверены, что это те, которые вы хотите удалить. И, возможно, сделать резервную копию, чтобы быть уверенным.Во втором проходе удалите оставшиеся каталоги:
Это предотвращает удаление каталогов с, если они уже существовали ранее.
Еще один приятный трюк @glennjackman, который сохраняет порядок файлов, начиная с самых глубоких. Снова удалите,
echo
когда закончите.После этого может последовать обычная
rmdir
очистка.источник
while
циклическим перебором набора записей. Просто привык к этому. @ stérm -rf
может удалить файлы, которые были не из архива, а внутри каталога, имя которого совпадает с именем из архива. Лучше быть осторожным здесь и использоватьrmdir
во втором проходе.rmdir
необходимо запустить для каждого уровня вложенности каталогов. Таким образом, он будет очищенsubdir1
при первом проходе, но уйдет,dir1
поскольку он попытался удалить его первым, когда он не был пустым в то время. Эту команду можно выполнить один раз, если список файлов можно отсортировать в обратном порядке.tar tvf arch.tar | tac | xargs echo rm
(удалите эхо, когда вы уверены)Вот возможность, которая возьмет извлеченные файлы и переместит их в подкаталог, очистив основную папку.
Сохраните это в файл
fix-tar.pl
и затем выполните это так:Это подтвердит, что ваш
tar
список похож на мой. Вы должны получить вывод как:Если это выглядит хорошо, запустите его снова так:
fixup.sh
Сценарий будет оболочка команды , которые будут перемещать файлы верхнего уровня и каталоги в «чистую» папку (в данном случае папкаcleanup
). Посмотрите этот скрипт, чтобы убедиться, что он кошерный. Если это так, теперь вы можете навести порядок:Я предпочитаю такую очистку, потому что она не уничтожает ничего, что еще не было уничтожено перезаписью этой начальной буквой
tar xv
.Примечание: если этот исходный результат пробного запуска выглядит неправильно, вы должны иметь возможность поиграть с числами в двух
substr
вызовах функций, пока они не будут выглядеть правильно.$perms
Переменная используется только для сухого хода так действительно только$dirent
подстрок должно быть правильным.Еще одна вещь: вам может понадобиться использовать эту
tar
опцию,--numeric-owner
если имена пользователей и / или имена групп вtar
списке делают имена начинающимися в непредсказуемом столбце.источник
Такого рода (антиобщественный) архив называют «бомбой-смолой» из-за того, что он делает. Как только один из них «взорвется» на вас, решения в других ответах будут намного лучше, чем я бы предложил.
Лучшее «решение», однако, состоит в том, чтобы предотвратить проблему в первую очередь.
Самый простой (самый ленивый) способ сделать это - всегда распаковывать архив tar в пустой каталог. Если он включает в себя каталог верхнего уровня, то вы просто перемещаете его в нужное место назначения. Если нет, просто переименуйте ваш рабочий каталог (тот, который был пустым) и переместите его в нужное место.
Если вы просто хотите сделать все правильно с первого раза, вы можете запустить tar -tvf archive-file.tar | меньше, и он будет перечислять содержимое архива, чтобы вы могли увидеть, как он структурирован, а затем сделать то, что необходимо, чтобы извлечь его в нужное место для начала.
Опция t также пригодится, если вы хотите проверить содержимое архива, просто чтобы посмотреть, есть ли в нем что-то, что вы ищете. Если это так, вы можете, при желании, просто извлечь файлы, которые вы хотите.
источник