Типичная ошибка для меня - извлечение в неправильном каталоге.

После того, как я это понимаю, я хочу удалить весь этот файл и распаковать снова.

Но как автоматизировать эту операцию удаления всего этого дерьма?

Какие-либо предложения?

UPD: машина linux (zsh)

1 ответ1

1

Это должно сделать трюк:

tar -tzf archive.tar.gz | sed 's@^//*@@' | sort -r | xargs -d '\n' rm -d

Если ваш архив содержит абсолютные пути и вы распаковали его в абсолютные места (для этого вам нужно использовать опцию -P tar), вы должны sed . Вы также можете не использовать sed , если вы абсолютно уверены, что в вашем архиве нет абсолютных путей.

tar -tzf archive.tar.gz | sort -r | xargs -d '\n' rm -d

объяснение

Вы можете получить список файлов в архиве tar.gz, используя опцию -t :

tar -tzf archive.tar.gz

Если есть малейшая вероятность того, что в вашем архиве есть абсолютные пути, и вы не распаковали, используя опцию -P для tar (которая распаковывает в абсолютные места вместо текущего или заданного каталога), вам нужно убрать начальные косые черты из список файлов, потому что tar -tf всегда будет их показывать. sed может помочь с этим:

tar -tzf archive.tar.gz | sed 's@^//*@@'

Берет шаблон между первым и вторым @ - ^//* , который соответствует одному или нескольким / в начале строки - и заменяет его строкой между вторым и третьим @ - в этом случае ничем, эффективно удаляя матч.

С помощью xargs вы можете выводить одну команду в качестве аргументов другой:

tar -tzf archive.tar.gz | sed 's@^//*@@' | xargs -d '\n' rm

Он берет список файлов, разделенных символами новой строки (-d '\n'), и передает их в rm . Это приведет к удалению любого файла. Как обычно, каталоги не будут удалены, и вы получите сообщение об ошибке для каждого из них.

Чтобы получить также любой каталог, созданный предыдущей распаковкой, вам нужно будет использовать rm -d , который также удалит пустые каталоги. Вывод tar -t обычно упорядочен в алфавитном порядке, что означает, что любой каталог будет указан перед файлами в них. Это будет означать, что каталог еще не пуст, когда rm пытается его удалить. Чтобы избежать этой проблемы, мы просто используем sort -r чтобы переупорядочить список в обратном алфавитном порядке. Таким образом, любой файл в каталоге будет удален до того, как rm попытается удалить сам каталог.

tar -tzf archive.tar.gz | sed 's@^//*@@' sort -r | xargs -d '\n' rm -d

Каталоги, которые содержат файлы, которых нет в архиве (например, если каталог уже существовал и содержал файлы до распаковки), не будут удалены. Пожалуйста, не используйте rm -r вместо rm -d потому что он также может удалять файлы и каталоги, которые не находятся в архиве.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .