Linux - 删除所有未在控制文件中列出的扩展名的文件?

时间:2012-12-20 02:17:48

标签: bash

我想删除所有具有特定扩展名(.xsl)的文件,其名称​​不包含在另一个文件中。也就是说,如果我有一个像

这样的文件
a.xsl
b.xsl
c.xsl

这样的目录结构
./a.xsl
./d.xsl
./folder1/b.xsl
./folder1/folder2/c.xsl
./folder1/folder2/e.xsl

我希望能够删除d.xsle.xsl,但不能删除a.xslb.xslc.xsl。目标shell是BASH。

3 个答案:

答案 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)

如果您的路径名称中没有空格,那么您可以使用fgrepgrep -F来完成任务:

find . -name '*.xsl' -print | grep -F -v -f excluded.files | xargs rm -f

如果您可能需要处理任意路径名(换行符,空格等),那么您必须更加努力。