我使用的是 Oracle Solaris。
我在用:
grep "searchstring" filename.*
上面的命令返回我的搜索结果。
现在我想将上面搜索结果中的所有文件(不是搜索结果的所有文件)移动到特定目录中../mydir/
。
如何在一个命令中完成此操作(搜索和移动都应在一行命令中完成)。
答案1
从ksh
, bash
or /usr/xpg4/bin/sh
,假设文件名不包含换行符,您可以在(grep -l
的输出上使用 split+glob 运算符-l
我是匹配的文件)。
通过离开来调用该运算符命令替换(`...`
或$(...)
) 不加引号。在这里,我们使用特殊变量对其进行调整,$IFS
以说明我们要分割哪个字符(此处为换行符),并通过禁用该glob
部分set -f
:
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(我们恢复通配符里面用于扩展filename*
) 的命令替换(在子 shell 中运行)。
您可以将其简化为:
mv $(grep -l searchstring filename*) ../mydir/
如果您知道文件名不包含空格、制表符、换行符、*
或?
字符[
。上面的拆分是在换行符、空格和制表符(这是 的默认值$IFS
)上完成的,并且对拆分结果的每个单词执行通配符(但如果没有文件名包含通配符,则这不是问题)。
如果您不能保证文件名不包含换行符,您可以使用循环:
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done