Как вы 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", т. е. он будет запрашивать перед перезапись других файлов.
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]