Linux: Удаление регистрирует, которые не содержат все определенные слова

Попробуйте следующее:

 s/ 0| [^0].*//g

Причиной наблюдаемого поведения является то, что POSIX управляет механизмами, чтобы они следовали самому длинному стандарту соответствия . Так что, пока вторая сторона чередования длиннее первой, даже если она вторая по порядку, она совпадает раньше.

11
задан Daniel 5 March 2009 в 12:59
поделиться

8 ответов

Как насчет:

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

Если файл не содержит foo, затем первая строка удалит его.

Если файл не содержит bar, затем вторая строка удалит его.

Только файлы, содержащие обоих foo и bar должен быть оставлен

-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 для размещения в цикле.

21
ответ дан 3 December 2019 в 01:45
поделиться
list=`Word1 Word2 Word3 Word4 Word5`
for word in $list
    grep -L $word *.txt | xargs rm
done
11
ответ дан 3 December 2019 в 01:45
поделиться

Дополнение к ответам выше: Используйте символ новой строки в качестве разделителя для обработки имен файлов с пробелами!

grep -L $word $file | xargs -d '\n' rm
5
ответ дан 3 December 2019 в 01:45
поделиться

Чтобы сделать те же имена файлов соответствия (не содержание файлов как большинство решений выше), можно использовать следующее:

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 инвертирует поиск regexp шаблона или для нечто или для панели в имени файла. Дальнейшие слова, которые будут добавлены к списку, должны быть разделены \|, например, один \| два \| три

1
ответ дан 3 December 2019 в 01:45
поделиться

grep-L слово | xargs комната

1
ответ дан 3 December 2019 в 01:45
поделиться

Вы могли попробовать что-то вроде этого, но это может повредиться, если шаблоны содержат оболочку или 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 
0
ответ дан 3 December 2019 в 01:45
поделиться

Во-первых, удалите список файлов:

rm flist

Затем для каждого из слов добавьте файл к списку файлов, если он содержит то слово:

grep -l WORD * >>flist

Затем вид, uniqify и получает количество:

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} {}')

Это удаляет файлы в каталоге, который не имел всех трех слов:

0
ответ дан 3 December 2019 в 01:45
поделиться

Это удалит все файлы, который не содержит слова Ping или Отправленный

grep -L 'Ping\|Sent' * | xargs rm
-2
ответ дан 3 December 2019 в 01:45
поделиться