Существует несколько разных ответов на этот вопрос в порядке возрастания сложности.
Во-первых, если это один раз, и в данном конкретном случае вы абсолютно уверены, что в ваших именах файлов нет странных символов(пробелы в порядке, но не символы табуляции, перевода строки и других управляющих символов, а также символы Юникода) это будет работать:
tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r
Все, что например, например, пропустить во всех подкаталогах подкаталогов.
Еще один способ сделать это, работающий с прикольными именами файлов, заключается в следующем:
mkdir foodir
cd foodir
tar -xf ../file.tar
for file in *; do rm -rf ../"$file"; done
Это создаст каталог, в который был бы расширен ваш архив, но, похоже, вы все равно этого хотели.Он также не будет обрабатывать файлы, имена которых начинаются с .
.
. Чтобы этот метод работал с файлами, которые начинаются с .
, сделайте следующее:
mkdir foodir
cd foodir
tar -xf ../file.tar
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "$@"; do rm -rf ../"$file"; done' junk
Наконец, принимаяиз ответа Мата , вы можете сделать это, и оно будет работать для любого имени файла и не потребовать от вас повторного распаковывания каталога:
tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "$@"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r