我正在制作一个构建文件,我需要你的帮助。
当前目录/文件位于以下位置
/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 --remove-files --same-permissions
重新定义的目录/文件正在跟随。
(空的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/
但是,这是我的预期。
/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/
这就是我想要的!谢谢,Etan。
但我不知道如何从原来的 list.txt 中删除 aaa , aaa / bbb 。
在这种情况下, aaa / bbb 是公共父目录,但在某些情况下可以更改为 aaa / bbb / zzz 。
答案 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的每一行并获取其上层目录名称,并在它为空时尝试将其删除。
注意:此脚本不处理目录/文件名中的空格。