Grep
grep 命令查找包含文本字元串的文件並移動它們
我可以使用以下命令在包含特定文本字元串的文件夾中找到文件:
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
但即便如此,如果您作為一個使用者在其他使用者可寫的目錄上執行它,請注意競爭條件和可能的安全問題。
xargs
與mv
的第三種語法一起使用: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 中)。