Внутри каталога, как я могу удалить файлы, которые не имеют ни одного из указанных слов, чтобы остались только файлы, содержащие ВСЕ слова? Я попытался написать простую оболочку bash script с помощью команд grep и rm, но я потерялся. Я совершенно новичок в Linux, любая помощь будет оценена
Linux: удаление файлов, которые не содержат всех указанных слов
Ответ 1
Как насчет:
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.
См. также @Сообщение Миколы Голубева для размещения в цикле.
Ответ 2
list=`Word1 Word2 Word3 Word4 Word5`
for word in $list
grep -L $word *.txt | xargs rm
done
Ответ 3
Дополнение к приведенным выше ответам: используйте символ новой строки как разделитель для обработки имен файлов с пробелами!
grep -L $word $file | xargs -d '\n' rm
Ответ 4
grep -L word | xargs rm
Ответ 5
Чтобы сделать те же совпадающие имена файлов (а не содержимое файлов в большинстве решений выше), вы можете использовать следующее:
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 для foo или bar в имени файла. Любые дополнительные слова, которые нужно добавить в список, нужно разделить на \| например один \| два\| три
Ответ 6
Сначала удалите список файлов:
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 должны быть удалены. Я оставлю вам письмо/тестирование script.
Хорошо, ты убедил меня, вот мой script:
#!/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} {}')
Это удаляет файлы в каталоге, в котором не было всех трех слов:
Ответ 7
Вы можете попробовать что-то вроде этого, но оно может сломаться если шаблоны содержат мета-символы оболочки или 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
Ответ 8
Это приведет к удалению всех файлов, которые не содержат слов Ping или Sent
grep -L 'Ping\|Sent' * | xargs rm