Как вы grep содержимое всех файлов в Каталоге для "TEST", а затем переместить эти файлы в другой каталог(например, домашний каталог.)?
как использовать grep и mv вместе в каталоге в shell?

2 ответа
просто еще одна альтернатива (хотя для этого требуются некоторые специфические расширения GNU; поскольку вы отметили вопрос "Unix", он может вам не подойти):
grep -lZd skip TEST SOURCE/* | xargs -0I{} mv -i {} DEST
grep -lпечатает совпадающие имена файлов вместо обычного вывода.
grep -Zдает нулевой байт, разделенный выводом, который является безопасной ставкой при обработке странных имен файлов трубная продукция.
grep -d skipопределяет
skipдействие для обнаруженных каталогов среди входных аргументов.это на самом деле не нужны, он просто избегает уведомления
grep: SOURCE/DIR: Is a directoryпри встрече каталогах. Если вы хотите рекурсивное чтение файлов в каталогах, используйте действиеrecurse, или даже короче просто эквивалент-rпереключатель (см. ниже точки А).SOURCE/*матчи все файлы в каталоге
SOURCEиспользование shell подстановка. Скрытые файлы по умолчанию не совпадают; это можно изменить, установивshopt -s dotglobв Баш передgrepкоманда выполнена.может возникнуть соблазн просто добавить
SOURCE/.*к входным аргументам, но это может иметь неожиданные последствия при использовании-r(так как мы совпадаем.и..как хорошо).если требуется рекурсивное соответствие, просто используйте
-r SOURCEбез глобус файла в качестве входного аргумента, который включает скрытые файлы в структуре каталогов.xargs -0интерпретирует ввод как null разделены.
xargs -I{}определяет
{}, чтобы быть заполнителем для входного аргумента.mv -iделает движение взаимодействующим согласно предложению Дэнниса, избежать ошибки.
чтобы проверить этот шаблон (или команды в целом), полезным методом является вставка echo перед фактической командой, чтобы увидеть, какие команды должны быть выполнены, т. е. изменить mv to echo mv.

вы можете комбинировать grep и найти для этой задачи:
find SOURCE -maxdepth 1 -type f -exec grep -q TEST {} \; -exec mv -i {} DEST \;
как это работает
find SOURCE -maxdepth 1 -type fнаходит все файлы (-type f) в каталоге SOURCE.если вы хотите включить файлы в подкаталоги, просто удалите
-maxdepth 1.-exec grep -q TEST {} \;greps файлы, один за другим, для строки тест. Вот,{}- это файл, который в данный момент обрабатывается.-qпереключатель делает grep "тихим", т. е. он ничего не выводит. The-execутверждение будет верным, если grep успешно, т. е. находит строку.-exec mv -i {} DEST \;перемещает файл, содержащий строку тест в каталоге DEST.-iпереключатель make mv "interactive", т. е. он будет запрашивать перед перезапись других файлов.

Komp




















