将搜索内容移动到不同的目录

将搜索内容移动到不同的目录

我使用的是 Oracle Solaris。

我在用:

grep "searchstring" filename.*

上面的命令返回我的搜索结果。

现在我想将上面搜索结果中的所有文件(不是搜索结果的所有文件)移动到特定目录中../mydir/

如何在一个命令中完成此操作(搜索和移动都应在一行命令中完成)。

答案1

ksh, bashor /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

相关内容