Grep

grep 命令查找包含文本字元串的文件並移動它們

  • March 16, 2022

我可以使用以下命令在包含特定文本字元串的文件夾中找到文件:

grep -lir 'string' ~/directory/*

如何將上述結果中出現的文件移動到另一個位置?

與往常一樣,提防grep -r. -r不是標準選項,並且在某些實現中,例如除最新版本的 GNU 之外的所有版本grep,它在下降目錄樹時遵循符號連結,這通常不是您想要的,並且可能會產生嚴重影響,例如,如果有一個符號連結到 “/ " 在目錄樹的某處。

在 Unix 哲學中,您使用一個命令在目錄中搜尋文件,並使用另一個命令查看其內容。

使用 GNU 工具,我會這樣做:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
 ) mv -i --target-directory /dest/dir

但即便如此,如果您作為一個使用者在其他使用者可寫的目錄上執行它,請注意競爭條件和可能的安全問題。

xargsmv的第三種語法一起使用:mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

請注意包含特殊字元(空格、引號)的文件。sed如果這是您的情況,使用(在文件名周圍添加引號)過濾列表s/^/'/;s/$/'/可能會有所幫助,但您必須確定,這些引號不會出現在文件名中。GNUgrep具有NUL 終止文件名的-Z/選項。--null

第三種語法 for 的替代方法mv是使用xargs佔位符字元串 ( -I)。

另一種選擇是命令替換 -$( )或````ire_and_curses 的回答中提到的反引號(在 bash 中)。

引用自:https://unix.stackexchange.com/questions/56903