我想删除所有具有特定扩展名(.xsl)的文件,其名称不包含在另一个文件中。也就是说,如果我有一个像
这样的文件a.xsl
b.xsl
c.xsl
和
这样的目录结构./a.xsl
./d.xsl
./folder1/b.xsl
./folder1/folder2/c.xsl
./folder1/folder2/e.xsl
我希望能够删除d.xsl
和e.xsl
,但不能删除a.xsl
,b.xsl
或c.xsl
。目标shell是BASH。
答案 0 :(得分:1)
像这样(未经测试):
for fn in $(find -type f -name '*.xsl')
do
echo ${fn##*/} | grep -vf file1 >/dev/null && rm $fn
done
其中file1是包含文件条目列表的文件。
${fn##*/}
这将删除所有内容,直到最后一个斜杠为止。这是grep
针对该文件,如果没有重新发送,则删除。
答案 1 :(得分:0)
此命令将执行此操作:
find -type f -name '*.xsl' -exec bash -c \
'BN=`basename {}`; [[ -z `grep $BN used_xsl` ]] && svn rm {}' \;
但我想知道是否有更好的方法呢?这似乎是一种相当低效/迂回的方式来做我想做的事......
答案 2 :(得分:0)
如果您的路径名称中没有空格,那么您可以使用fgrep
或grep -F
来完成任务:
find . -name '*.xsl' -print | grep -F -v -f excluded.files | xargs rm -f
如果您可能需要处理任意路径名(换行符,空格等),那么您必须更加努力。