Как всегда остерегайтесь grep -r. -rне является стандартным вариантом, и в некоторых реализациях, таких как все, кроме самых последних версий GNU grep, он следует по символическим ссылкам при спуске по дереву каталогов, что, как правило, не то, что вам нужно, и может иметь серьезные последствия, если, например, есть символическая ссылка на "/ "где-то в дереве каталогов.
В философии Unix вы используете команду для поиска в каталогах файлов, а другую - для просмотра ее содержимого.
Но даже в этом случае остерегайтесь состояния гонки и возможных проблем безопасности, если вы запускаете его как один пользователь в каталоге, доступном для записи другому пользователю.
это дает мне ошибку find: `grep 'завершается сигналом 13. есть идеи, что происходит не так?
Рина Парех
@ReenaParekh, это будет SIGPIPE. Это может произойти только в случае xargsвыхода перед чтением до конца его arg-файла, что не должно произойти, если xargs не будет уничтожен сам или не завершится неудачей по любой причине, и в этом случае я ожидаю, что вы также увидите ошибку об этом.
Стефан Шазелас
15
Использование xargsсовместно с mvтретьим синтаксисом «S:mv [OPTION]... -t DIRECTORY SOURCE...
grep -lir 'string' ~/directory/* | xargs mv -t DEST
Будьте осторожны с файлами, содержащими специальные символы (пробелы, кавычки). Если это ваш случай, фильтрация списка с sed(добавление кавычек вокруг имен файлов с s/^/'/;s/$/'/помощью) может помочь, но вы должны быть уверены, что эти кавычки не появятся в именах файлов. GNU grepимеет параметр -Z/ --nullдля NUL-конца имен файлов.
Альтернативой третьему синтаксису для mvявляется использование xargsс заполнителем string ( -I).
Другой вариант - подстановка команд - $( )или обратные галочки ``(в bash), как указано в ответе ire_and_curses.
Gnu grep поддерживает флаг -Z для разделения имен файлов нулевым байтовым символом, который при использовании вместе с флагом -0 для xargs может обойти упомянутую вами проблему специальных символов
iruvar
@ChandraRavoori спасибо, я обновил ответ.
Петер
7
Если имена ваших файлов не содержат специальных символов (пробел или \[*?), используйте подстановку команд :
grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
Ответы:
Как всегда остерегайтесь
grep -r
.-r
не является стандартным вариантом, и в некоторых реализациях, таких как все, кроме самых последних версий GNUgrep
, он следует по символическим ссылкам при спуске по дереву каталогов, что, как правило, не то, что вам нужно, и может иметь серьезные последствия, если, например, есть символическая ссылка на "/ "где-то в дереве каталогов.В философии Unix вы используете команду для поиска в каталогах файлов, а другую - для просмотра ее содержимого.
Используя инструменты GNU, я бы сделал:
Но даже в этом случае остерегайтесь состояния гонки и возможных проблем безопасности, если вы запускаете его как один пользователь в каталоге, доступном для записи другому пользователю.
источник
xargs
выхода перед чтением до конца его arg-файла, что не должно произойти, если xargs не будет уничтожен сам или не завершится неудачей по любой причине, и в этом случае я ожидаю, что вы также увидите ошибку об этом.Использование
xargs
совместно сmv
третьим синтаксисом «S:mv [OPTION]... -t DIRECTORY SOURCE...
Будьте осторожны с файлами, содержащими специальные символы (пробелы, кавычки). Если это ваш случай, фильтрация списка с
sed
(добавление кавычек вокруг имен файлов сs/^/'/;s/$/'/
помощью) может помочь, но вы должны быть уверены, что эти кавычки не появятся в именах файлов. GNUgrep
имеет параметр-Z
/--null
для NUL-конца имен файлов.Альтернативой третьему синтаксису для
mv
является использованиеxargs
с заполнителем string (-I
).Другой вариант - подстановка команд -
$( )
или обратные галочки``
(в bash), как указано в ответе ire_and_curses.источник
Если имена ваших файлов не содержат специальных символов (пробел или
\[*?
), используйте подстановку команд :источник
Использование только POSIX указанных особенностей, и не делая ни одного предположения о именах файлов:
Примечания:
Вы сказали «строка», а не «шаблон», поэтому
-F
опция (поиск по фиксированной строке)grep
кажется подходящей.Если каталог назначения находится где-либо внутри каталога поиска, у вас могут быть неприятные условия гонки.
POSIX спецификации для
grep
POSIX спецификации для
find
источник
Используя GNU параллельно :
ht / @ lin-dong за оригинальный ответ xargs.
источник
Предположим, что у вас есть каталог назначения как «внешний» и вам нужно переместить все файлы XLS, вы можете попробовать следующую команду
sudo mv
find /var/log/ -type f -name "*.xls"
/ external /источник