Linux: удаление файлов, которые не содержат всех заданных слов
внутри каталога, как я могу удалить файлы, в которых отсутствуют какие-либо из указанных слов, так что остаются только файлы, содержащие все слова? Я попытался написать простой скрипт оболочки bash, используя команды grep и rm, но я заблудился. Я совершенно новичок в Linux, любая помощь будет оценена
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.
см. также @Мыкола социально-экономической ситуации после для размещения в петлю.
дополнение к ответам выше: используйте символ новой строки в качестве разделителя для обработки имен файлов с пробелами!
grep -L $word $file | xargs -d '\n' rm
чтобы сделать те же совпадающие имена файлов (а не содержимое файлов, как большинство решений выше), вы можете использовать следующее:
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
the-ve отменяет поиск шаблона регулярного выражения для foo или bar в имени файла. Любые дополнительные слова, которые будут добавлены в список, должны быть разделены \| например, один\два\три
во-первых, удалите файл-список:
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 ' != 3 {print } {}')
это удаляет файлы в каталоге, которые не имели все три слова:
вы можете попробовать что-то вроде этого, но это может сломаться если шаблоны содержат 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
это удалит все файлы, которые не содержат слов пинг или отправлено
grep -L 'Ping\|Sent' * | xargs rm