Короче говоря, у меня есть папка с почти 800 000 php-файлов. Я хотел бы искать строку в каждом файле, и если она есть в этом файле, файл копируется в другой каталог.
Возможно ли это сделать с терминала?
На данный момент я получил:
grep -i -n -r 'ppr-1792' * | cp $1 переместить_туда_сюда
Но это, очевидно, не работает. $1 должно быть именем файла, содержащим соответствующий текст.
Что я должен делать?
решение1
Вы можете использовать цикл for и проверить код возврата grep или использовать grep -c
(count matches) и посмотреть, больше ли 1 количество совпадений.
например
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
решение2
Это можно легко сделать с помощью одной строчки:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
Некоторые комментарии о том, как это работает. Параметр Grep -l выводит только имя файла, если в файле есть совпадение, поэтому он создает список файлов для копирования. Команда Xargs создает команду для каждой команды копирования и выполняет ее. Xargs заменяет аргумент с именем "source" на имя файла, считанное из стандартного ввода. Пробелы и другие забавные символы в именах файлов обрабатываются с помощью параметров -Z и -0.