2

Короче говоря, я получил папку с почти 800 000 php-файлов. Я хотел бы найти в каждом файле строку и, если она существует в этом файле, файл копируется в другой каталог.

Это возможно из терминала?

Пока что я получил:

grep -i -n -r 'ppr-1792' * | cp $ 1 move_to_here

Но это, очевидно, не работает. $ 1 должно быть именем файла, содержащего соответствующий текст.

Что я должен делать?

2 ответа2

1

Вы можете сделать это легко с хорошим лайнером:

grep -l -i -r -Z pattern | xargs -0 -I source cp source /target

Некоторые комментарии, как это работает. Опция -l Grep печатает только имя файла, если в файле есть совпадение, поэтому он создает список файлов, которые нужно скопировать. Команда Xargs создает команду для каждой команды копирования и выполняет ее. Xargs заменяет аргумент с именем "source" на имя файла, считываемое из стандартного ввода. Пробелы и другие забавные символы в именах файлов обрабатываются с опциями -Z и -0.

0

Вы можете использовать цикл for и тестировать код возврата grep, или использовать grep -c (количество совпадений) и посмотреть, больше ли число совпадений, чем 1.

например

for i in *
do
    grep -i -n 'Power' "$i"

    if [ "$?" -eq 0 ]
    then
            cp "$i" mvd
    fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .