Это должно сделать трюк:
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
потому что он также может удалять файлы и каталоги, которые не находятся в архиве.