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