2013-10-17 28 views
1

对于Linux中的脚本编程来说是新手,所以我希望这很简单。我需要将包含多个文件的目录移动到另一个位置,如果该目录包含一个带有特定文本的文件。用于移动包含文件的目录的Linux脚本

我有一个命令,让我到这里来匹配我的标准目录的列表:

find . -name 'file.name' -print0 | xargs -0 grep -l "foo" | sed 's#\(.*\)/.*#\1#' | sort -u 

现在我只需要利用这个结果,并与可执行脚本内的mv命令将它们结合起来。

+0

为什么sed和排序? – anubhava

回答

3

您可以使用xargs与替换,以获得预期的效果:

commands to get directory list | xargs -i mv "{}" <destination> 
+0

这个最终成为我的解决方案,因为它可以轻松地处理带有空格和特殊字符的目录名称,谢谢 –

2

假设所有的出来您发布的管道是目录名称:

$target=/home/me/example 
find . -name 'file.name' -print0 | 
xargs -0 grep -l "foo" | 
sed 's#\(.*\)/.*#\1#' | 
while read line #line is a variable with the contents of one line 
do 
    mv $line $target 
done 

哦,摆脱那种-u 没有必要为它移动的目录和它的序列化'你的管道,你不能排序,直到发现完成,所以这些动作不会开始,没有它的动作可以开始为第一个项目被找到时的SOON。

+0

真棒,完美工作,谢谢! –

+0

好吧,它的工作,直到我的目录有他们的名字中的空格...结束了与下面的xargs选项 –

+0

'mv“$ line”“$ target”'但同意xargs选项在这里更好 这虽然读结构_can_对复杂的处理很有用,但我需要使用xargs更多 – tolanj

0

backtick operator评估命令,并将就好像你进入它的命令行上stdout。所以,在你的情况:

相关问题