如何从原位的tarball中删除空目录

时间:2018-06-28 12:02:11

标签: bash shell gnu tar

我从docker映像中提取了一个图层,该映像存档在一个名为layer.tar的文件中。我要从中删除空目录。

我不想解压缩然后重新打包该存档中的文件,我想保留原始信息,所以我想就地进行。

我知道如何从tar中删除文件,但是我不知道任何简单的方法来就地删除空目录。

1 个答案:

答案 0 :(得分:1)

让我们用a/b/c/a/b/c/d/空目录创建一个存档t.tar:

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中的每个目录,我们可以使用简单的grep检查tmpfiles中是否有文件,然后使用--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/