tar后如何删除空目录?

时间:2014-11-20 01:50:59

标签: shell sed tar

我正在制作一个构建文件,我需要你的帮助。

  1. 当前目录/文件位于以下位置 /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3 /home/myhome/aaa/bbb/fff/file4 /home/myhome/aaa/bbb/fff/ggg/file5 /home/myhome/aaa/bbb/fff/hhh/file6 /home/myhome/aaa/bbb/iii/file7 /home/myhome/aaa/bbb/iii/jjj/file8 /home/myhome/aaa/bbb/iii/kkk/file9

  2. 我想从list.txt获取目标文件并绑定到存档文件中。
    cat list.txt /aaa/ /aaa/bbb/ /aaa/bbb/fff/ /aaa/bbb/fff/file4 /aaa/bbb/fff/ggg/ /aaa/bbb/fff/ggg/file5 /aaa/bbb/fff/hhh/ /aaa/bbb/fff/hhh/file6 /aaa/bbb/iii/ /aaa/bbb/iii/file7 /aaa/bbb/iii/jjj/ /aaa/bbb/iii/jjj/file8 /aaa/bbb/iii/kkk/ /aaa/bbb/iii/kkk/file9

  3. 我尝试过如下。 sed -e '\@/$@ d' -e 's@^/@@' list.txt > list2.txt tar -cz -f list.tar.gz -C /home/myhome -T list2.txt --remove-files --same-permissions

  4. 重新定义的目录/文件正在跟随。
    (空的dirs没有被删除。) /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3 /home/myhome/aaa/bbb/fff/ggg/ /home/myhome/aaa/bbb/fff/hhh/ /home/myhome/aaa/bbb/iii/jjj/ /home/myhome/aaa/bbb/iii/kkk/

  5. 但是,这是我的预期。 /home/myhome/aaa/bbb/ccc/file1 /home/myhome/aaa/bbb/ccc/ddd/file2 /home/myhome/aaa/bbb/ccc/eee/file3

  6. 你能帮我吗?

    ====================
    回复评论

    现在我尝试修改list2.txt(使用vim not script),如下所示。
    cat list2.txt      aaa/bbb/iii/kkk/file9 aaa/bbb/iii/kkk/ aaa/bbb/iii/jjj/file8 aaa/bbb/iii/jjj/ aaa/bbb/iii/file7 aaa/bbb/iii/ aaa/bbb/fff/hhh/file6 aaa/bbb/fff/hhh/ aaa/bbb/fff/ggg/file5 aaa/bbb/fff/ggg/ aaa/bbb/fff/file4 aaa/bbb/fff/

    这就是我想要的!谢谢,Etan。

    但我不知道如何从原来的 list.txt 中删除 aaa aaa / bbb
    在这种情况下, aaa / bbb 是公共父目录,但在某些情况下可以更改为 aaa / bbb / zzz

2 个答案:

答案 0 :(得分:0)

你的sed电话中有拼写错误:

sed -e '\@/$@ d' -e 's/@^/@@' list.txt > list2.txt

/表达式中的s之后您错过了-e s...。如果没有此修复程序,list2.txt将为空。

答案 1 :(得分:0)

由于您要求仅删除空文件夹(虽然我认为sed命令很奇怪/错误,但我不知道您的目标,因此我无法更改您的sed我会假设你的sed对你的目标很好,这是一种方法:

xargs -i rmdir {} < flist.txt 2> /dev/null
xargs -i dirname {}  < flist.txt | xargs -i rmdir {} 2> /dev/null

第一行将flist.txt的每一行视为目录名,并在它为空时尝试删除它(如果它是文件则失败,这是正常的)。 第二行占用flist.txt的每一行并获取其上层目录名称,并在它为空时尝试将其删除。

注意:此脚本不处理目录/文件名中的空格。