как использовать grep и mv вместе в каталоге в shell?

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

16
задан john
20.05.2023 16:34 Количество просмотров материала 2997
Распечатать страницу

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.

1
отвечен Daniel Andersson 2023-05-22 00:22

вы можете комбинировать 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", т. е. он будет запрашивать перед перезапись других файлов.

1
отвечен Dennis 2023-05-22 02:39

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх