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
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中删除aaa,aaa/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/*应保留在磁盘中。