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