Давайте создадим архив t.tar с a/b/c/
и a/b/c/d/
пустыми каталогами:
mkdir -p dir
cd dir
mkdir -p a/b/c/d
mkdir -p 1/2/3/4
touch a/fil_ea a/b/file_ab # directory a/b/c and a/b/c/d are empty
touch 1/2/3/file_123 1/2/3/4/file_1234 # directories 1/2/3/4 not empty
tar cf ../t.tar a 1
cd ..
Используя tar tf
и некоторую фильтрацию, мы можем извлечь каталоги и файлы в архив tar. Затем для каждого каталога в tmpdirs
мы можем проверить, есть ли в нем файлы в tmpfiles
, с помощью простого grep, а затем удалить эти каталоги, используя --delete
параметр tar:
tar tf t.tar | tee >(grep '/$' > tmpdirs) | grep -v '/$' > tmpfiles
cat tmpdirs | xargs -n1 -- sh -c 'grep -q "$1" tmpfiles || echo "$1"' -- \
| tac \
| xargs -- tar --delete -f t.tar
Не то, чтобы tac был немного ненужным, но файлы были отсортированы по алфавиту в tar, поэтому, когда tar сначала удаляет каталог a/b/c/
со всеми подкаталогами, а затем пытается удалить каталог a/b/c/d/
, происходит сбой с Not found in archive
в ошибка. tac
- это дешевый способ исправить это, поэтому tar сначала удаляет a/b/c/d/
, а затем a/b/c/
.