2012-12-20 32 views
0

我想要删除特定扩展名(.xsl)中包含的其他文件中名称为而非的所有文件。也就是说,如果我有一个像Linux - 删除所有扩展名未在控制文件中列出的文件?

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。

+0

您可能想要在[SuperUser](http://superuser.com)或[ServerFault](http://serverfault.com)上发布此信息。 – paddy

回答

1

像这样(未测试):

for fn in $(find -type f -name '*.xsl') 
do 
    echo ${fn##*/} | grep -vf file1 >/dev/null && rm $fn 
done 

其中文件1是包含文件条目列表中的文件。

${fn##*/}这将删除一切,直到最后一个斜杠给出文件名。这是grep反对该文件,如果不是resent,删除。

+0

未经测试,但非常确定回声部分不是它...也许与'grep -v“循环相同$ {fn ## * /}”file && rm“$ fn”' – technosaurus

0

此命令将做到这一点:

find -type f -name '*.xsl' -exec bash -c \ 
    'BN=`basename {}`; [[ -z `grep $BN used_xsl` ]] && svn rm {}' \; 

但我不知道是否有更好的方法来做到这一点?这似乎是在做我想要什么的相当低效/环岛路......

0

如果你的路径名称将不能有空格他们,那么你可以使用fgrepgrep -F整齐地做任务:

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

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

相关问题