Shell 如何删除tar后的空目录?

Shell 如何删除tar后的空目录?,shell,sed,tar,Shell,Sed,Tar,我正在制作一个构建文件,我需要你的帮助 当前目录/文件的位置如下 /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/a

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

  • 当前目录/文件的位置如下
    
    /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
    

  • 我想从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
    

  • 我试着像下面那样。
    
    sed-e'\@/$@d'-e's@^/@'list.txt>list2.txt
    tar-cz-f list.tar.gz-C/home/myhome-T list2.txt--删除文件--相同的权限
    

  • 并且铰孔指令/文件如下所示
    (未删除空目录。)
    
    /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/
    

  • 但是,这正是我所期望的。
    
    /home/myhome/aaa/bbb/ccc/file1
    /home/myhome/aaa/bbb/ccc/ddd/file2
    /home/myhome/aaa/bbb/ccc/eee/file3
    

  • 你能帮我吗

    ============================
    对评论的答复

    现在我尝试修改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/
    

    这就是我想要的!谢谢你,伊坦

    但是我不知道如何从原来的list.txt中删除aaaaaa/bbb

    在这种情况下,aaa/bbb是通用的父目录,但在某些情况下可以将其更改为aaa/bbb/zzz

    您的sed呼叫中有一个输入错误:

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

    -es..
    表达式中,在
    s
    之后缺少
    /
    。如果没有这个补丁,
    list2.txt
    将是空的。

    由于您只要求删除空文件夹(虽然我认为
    sed
    命令很奇怪/错误,但我不知道您的目标,因此我无法对您的
    sed
    进行更改。我将假定您的
    sed
    可以很好地实现您的目标),以下是一种方法:

    xargs -i rmdir {} < flist.txt 2> /dev/null
    xargs -i dirname {}  < flist.txt | xargs -i rmdir {} 2> /dev/null
    
    xargs-irmdir{}/dev/null
    xargs-i dirname{}/dev/null
    
    第一行将flist.txt的每一行视为目录名,并在其为空时尝试将其删除(如果是文件,则失败,这是确定的)。 第二行获取flist.txt的每一行并获取其上级目录名,当其为空时尝试将其删除


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

    该表达式中的
    @
    是标记,而不是
    /
    。您的版本是一个语法错误,因为最终的
    /
    不存在。他的版本是正确的,可以将前导斜杠替换为零。@EtanReisner,我试用时它对我不起作用-必须在第二个
    -e
    中添加
    /
    。您使用的是什么版本的sed?如果运行
    echo/foo/bar|sed-e's^/@'
    ,您会得到什么(错误?)?这里的问题是为什么不删除空的
    fff/ggg
    fff/hhh
    等目录?谢谢!我在正文中回答。我不理解更新后的问题。您想从磁盘或文件路径中删除
    /aaa/bbb
    目录?从文件路径中删除/aaa/bbb和/aaa/bbb/ccc/*应保留在磁盘中。