LINUX.ORG.RU

Как поудалять файлы, содержащие данную подстроку?


0

0

Есть подстрока. Идеально, если регексп. Нет - так хоть с фиксированной. Нужно удалть все файлы в каталоге, в которых есть эта строчка.

Проблема в том, что файлов в каталоге 110+ тыс :D

★★★★★

Ответ на: комментарий от Selecter

Блин, да мне быстрее perl-скрипт в десяток строк написать, чем столько манов перечитать :D Я думал тут есть хоть один человек, который это итак знает. Которому не сложно пару десяток символов команды набить :)

Кстати, каким тут боком iconv? И почему тут нет find? :D

KRoN73 ★★★★★
() автор топика

что-то типа того на bash:

for i in `find $dir`; do
    if egrep 'REGEX' $i; then rm -f $i; fi
done

FreeBSD ★★★
()

find ./ -type f -printf "grep -q 'regexp' %p && rm -f %p\n" | bash

sdio ★★★★★
()

Проблема в количестве файлов?

$ cat ../tst_and_do.sh
#!/bin/sh
grep "test string or regexp" "$1" && rm -f "$1"

$ find . -type f | xargs ../tst_and_do.sh

P.S.: не надо подкалывать, мальчик! Этим "подколам" сто лет
в обед, и уж точно не виндузятникам их вспоминать.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>$ cat ../tst_and_do.sh
>#!/bin/sh
>grep "test string or regexp" "$1" && rm -f "$1"
>
>$ find . -type f | xargs ../tst_and_do.sh
Я могу и ошибаться, но как мне кажется xargs запустит
tst_and_do.sh file1 file2 ... fileN
верно? Но tst_and_do.sh проверит и удалит только один файл $1
Я прав?

sdio ★★★★★
()
Ответ на: комментарий от sdio

> Я прав?

Упс! Прав :-) Кажется я man невнимательно читал :-) Тогда

find . -type f | gawk '{ system("../tst_and_do.sh "$1); }'

no-dashi ★★★★★
()
Ответ на: комментарий от watashiwa_daredeska

> Самый быстрый способ:

Для ограниченного количесвта файлов. При большом количестве файлов наступают грабли - "кончается" командная строка! (там не то 32 тысячи аргументов, не то 32КБ - в общем, есть органичение:-))

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> Для ограниченного количесвта файлов

Нет. Для этого там и стоят find и xargs. Без них было бы:

$ rm -f `grep -l "строка" *`

Тут да - для ограниченного.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Спасибо, воспользовался методом

find . |xargs grep -l "строка" |xargs rm -f

22 минуты, однако, на 2xXeon-1800 и SCSI/10000RPM винтах :D

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

ждем треда "Как востановить 100к файлов по регекспу?" :)

FreeBSD ★★★
()
Ответ на: комментарий от KRoN73

> 22 минуты, однако, на 2xXeon-1800 и SCSI/10000RPM винтах :D

Можешь для сравнения повторить на Perl, но я сильно сомневаюсь, что будет быстрее.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от sdio

> Ты про xargs почитай

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

no-dashi ★★★★★
()
Ответ на: комментарий от anonymous

Не всякий grep умеет рекурсивно обходить директории.
Так что правильнее всего остается
   find . -type f | xargs grep -l 'foo' |xargs rm  

sdio ★★★★★
()
Ответ на: комментарий от watashiwa_daredeska

>> grep -l -d recurse remove_me *

>Если файлов в каталоге много - загнётся.

Это обходится
grep -l -d recurse remove_me .   
                            ^^^ . вместо *, все равно рекурсивный обход

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.