我正在使用 grep 生成我需要移动的文件列表:
grep -L -r 'Subject: \[SPAM\]' .
如何将此列表传递给 mv 命令并将文件移动到其他位置?
'Subject \[SPAM\]'
如果您想查找和移动与您的模式不匹配的文件(移动本示例中不包含的文件),请使用:
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR
-Z 表示在文件名后带有零 (\0) 的输出(因此空格不用作分隔符)。
xargs -0
表示将 \0 解释为分隔符。
-L 表示查找与模式不匹配的文件。如果要移动与您的模式匹配的文件,请替换-L
为。-l
然后
-I{} mv {} DIR
意味着{}
用文件名替换,所以你得到mv filenames DIR
.
此替代方法适用于 xargs 不可用的情况:
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
这是我在 Fedora Core 12 中使用的:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
这对我有帮助:
grep -lir 'spam' ./ | xargs mv -t ../spam
当然,我已经在所需的文件夹中(这就是为什么./
)并将它们移动到相邻的文件夹中。但是您可以将它们更改为任何路径。
我不知道为什么接受的答案不起作用。此外,我的文件名中没有空格和特殊字符——也许这行不通。
在这里被盗:Grep 命令查找包含文本字符串的文件并移动它们
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>
假设您编写的 grep 返回您期望的文件路径。
也许这会起作用:
mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
有几种方法,但这是一种缓慢但安全的方法:
IFS=$'\n'; # set the field separator to line break
for $mail in $(grep -L -r 'Subject: \[SPAM\]' .); do mv "$mail" your_dir; done;
IFS=' '; # restore FS
适合我的工作:
将包含带有 MYSTRINGTOSEARCH 字样的文本的文件移动到目录 MYDIR。
寻找 。-type f -exec grep -il 'MYSTRINGTOSEARCH' {} \; -exec mv {} MYDIR/\;
我希望这有帮助
您可以使用 grep ... | 将结果传递给下一个命令 xargs mv {} 目的地
检查 man xargs 了解更多信息。