Как удалить пустые каталоги из архива на месте - PullRequest
0 голосов
/ 28 июня 2018

Я извлек слой из образа докера, который заархивирован в файле layer.tar. Я хочу удалить из него пустые каталоги.

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

Я знаю, как удалять файлы из tar, но я не знаю простого способа удаления пустых каталогов на месте.

1 Ответ

0 голосов
/ 28 июня 2018

Давайте создадим архив 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/.

...