作者:fewtewtewt | 来源:互联网 | 2017-11-05 14:12
假设有两个目录 /opt/test_a 和 /opt/test_b, /opt/test_b目录下不仅包含了/opt/test_a目录下的文件也包含其他文件,现在要删除/opt/test_b目录中与/opt/test_a目录中同名的文件,但是不删除同名的子目录,可以使用如下命令:
cd /opt/test_a && ls -p | grep -v /$ | xargs -I{} rm -f /opt/test_b/{}
说明:
. ls -p 参数将给列出的目录名最后加上/
. grep -v 参数指定反选择, /$指定以/结尾的搜索模式,因此该命令将输出不带/结尾的项,也就是只输出/opt/test_a目录中的文件名,不包含子目录。
. xargs命令的-I{} 指定用管道传递过来的输入替换后面命令中的{}字符串,重复多次,直至管道没有输入
注:xargs加上 -t 参数,可以看到替换的效果
这个技巧用在makefile中,制作make install 和make uninstall。 对应的make install 执行的命令为:
cd /opt/test_a && ls -p | grep -v /$ | xargs -I{} install -m 755 {} /opt/test_b/