Как переместить все файлы, выводимые из команды?

22

У меня есть эта команда grep, чтобы найти файлы без слова Attachments в них.

grep -L -- Attachments *

Я хочу переместить все файлы, которые выводятся из этой команды. Как мне это сделать в Bash? Я использую трубу? Должен ли я использовать более многословный оператор if / then в полном сценарии?

bernie2436
источник

Ответы:

18

Если вы знаете, что ни один, если имена файлов содержат новые строки, табуляции, пробелы или комбинации глобусов, которые могут привести к совпадению, это может быть проще для одного случая:

mv $(grep -L Attachments *) dest_dir
Graeme
источник
36

То, что вы хотите сделать, это использовать параметр pipe и greps -Z:

Использование GNU grep и mv

grep -LZ -- Attachments * | xargs -0 mv -t target_directory

В -Zсочетании с xargs -0ручками любые имена файлов со специальными символами.

Использование BSD grep и mv (как в MacOS X)

grep -L --null -- Attachments * |
while IFS= read -r -d "" file; do 
    mv "./$file" target_directory
done

На BSD grep -Zозначает распаковка , grep --nullработает как на BSD, так и на GNU. BSD mvне хватает опции-t

Энтон
источник