Linux:删除不包含指定的所有单词的文件

时间:2009-03-05 12:59:29

标签: linux bash file shell

在目录中,如何删除缺少任何指定单词的文件,以便只保留包含所有单词的文件?我尝试使用grep和rm命令编写一个简单的bash shell脚本,但我迷路了。我是Linux新手,任何帮助都将不胜感激

8 个答案:

答案 0 :(得分:20)

怎么样:

grep -L foo *.txt | xargs rm
grep -L bar *.txt | xargs rm

如果文件 包含foo,则第一行会将其删除。

如果文件 包含bar,则第二行会将其删除。

只应保留同时包含foobar的文件

-L, --files-without-match
     Suppress normal output; instead print the  name  of  each  input
     file from which no output would normally have been printed.  The
     scanning will stop on the first match.

另请参阅@Mykola Golubyev's post进行循环播放。

答案 1 :(得分:11)

list=`Word1 Word2 Word3 Word4 Word5`
for word in $list
    grep -L $word *.txt | xargs rm
done

答案 2 :(得分:5)

除上述答案外:使用换行符作为分隔符来处理带空格的文件名!

grep -L $word $file | xargs -d '\n' rm

答案 3 :(得分:1)

grep -L word | xargs rm

答案 4 :(得分:1)

要执行相同的匹配文件名(不是上面大多数解决方案的文件内容),您可以使用以下内容:

for file in `ls --color=never | grep -ve "\(foo\|bar\)"`
do
   rm $file
done

根据评论:

for file in `ls`
不应该使用

。如果不使用ls

,下面的内容也是如此
for file in *
do
  if [ x`echo $file | grep -ve "\(test1\|test3\)"` == x ]; then
    rm $file
  fi
done

-ve反转搜索文件名中foo或bar的正则表达式模式。 要添加到列表中的任何其他单词需要用\ |分隔 例如一个\ | 2 \ | 3

答案 5 :(得分:0)

首先,删除文件列表:

rm flist

然后,对于每个单词,如果文件包含该单词,则将文件添加到文件列表中:

grep -l WORD * >>flist

然后排序,统一并获得计数:

sort flist | uniq -c >flist_with_count

应删除flsit_with_count中没有字数的所有文件。格式为:

2 file1
7 file2
8 file3
8 file4

如果有8个单词,则应删除file1和file2。我将把脚本的写作/测试留给你。

好的,你说服了我,这是我的剧本:

#!/bin/bash
rm -rf flist
for word in fopen fclose main ; do
    grep -l ${word} *.c >>flist
done
rm $(sort flist | uniq -c | awk '$1 != 3 {print $2} {}')

这将删除目录中没有全部三个单词的文件:

答案 6 :(得分:0)

你可以试试这样的东西,但它可能会破裂 如果模式包含 shell grep 元字符:

(在本例中一两三是模式)

for f in *; do
  unset cmd
  for p in one two three; do
    cmd="fgrep \"$p\" \"$f\" && $cmd"
  done
  eval "$cmd" >/dev/null || rm "$f"  
done 

答案 7 :(得分:-2)

这将删除所有不包含 Ping 已发送

字样的文件
grep -L 'Ping\|Sent' * | xargs rm