Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于移动包含文件的目录的Linux脚本_Linux_Bash_Scripting_Grep - Fatal编程技术网

用于移动包含文件的目录的Linux脚本

用于移动包含文件的目录的Linux脚本,linux,bash,scripting,grep,Linux,Bash,Scripting,Grep,在linux中编写脚本是相当新的,所以我希望这是一件简单的事情。我需要将包含多个文件的目录移动到另一个位置,如果该目录包含一个包含特定文本的文件 我有一个命令,它在这里为我提供了一个目录列表,这些目录与我的条件相匹配: find . -name 'file.name' -print0 | xargs -0 grep -l "foo" | sed 's#\(.*\)/.*#\1#' | sort -u 现在,我只需要将结果与可执行脚本中的mv命令结合起来。假设您发布的管道中的所有内容都是目录名:

在linux中编写脚本是相当新的,所以我希望这是一件简单的事情。我需要将包含多个文件的目录移动到另一个位置,如果该目录包含一个包含特定文本的文件

我有一个命令,它在这里为我提供了一个目录列表,这些目录与我的条件相匹配:

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

现在,我只需要将结果与可执行脚本中的mv命令结合起来。

假设您发布的管道中的所有内容都是目录名:

$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
哦,把这类东西扔掉-你
不需要它来移动目录,它会“序列化”您的管道,在查找完成之前您无法排序,因此移动不会开始,没有它,移动可以在找到第一个项目后立即开始。

假设您发布的管道中只包含目录名:

$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
哦,把这类东西扔掉-你
不需要它来移动目录,它会“序列化”您的管道,在查找完成之前您无法排序,因此移动不会开始,没有它,移动可以在找到第一个项目后立即开始。

您可以使用带替换的
xargs
,以获得所需的效果:

commands to get directory list | xargs -i mv "{}" <destination>
获取目录列表| xargs-i mv“{}”的命令
您可以将
xargs
与替换一起使用,以获得所需的效果:

commands to get directory list | xargs -i mv "{}" <destination>
获取目录列表| xargs-i mv“{}”的命令 对命令求值,并将
stdout
放置在命令行中,就像您在命令行中输入它一样。因此,在你的情况下:

mv`find-名称'file.name'-print0 | xargs-0 grep-l“foo”| sed's#\(.*\)/.#\1#'`target
对命令求值,并将
stdout
放置在命令行中,就像您在命令行中输入它一样。因此,在你的情况下:

mv`find-名称'file.name'-print0 | xargs-0 grep-l“foo”| sed's#\(.*\)/.#\1#'`target

在我的目录名称中有空格之前,它一直有效。。。最后使用了“mv”$line“$target”下面的xargs选项,但我同意这里的xargs选项更好,虽然读取结构对于复杂的处理很有用,但我需要更多地使用xargs。在我的目录名称中有空格之前,它一直有效。。。最后使用了“mv”$line“$target”下面的xargs选项,但同意这里的xargs选项更好,虽然读取结构对于复杂的处理很有用,但我需要更多地使用xargs。这是我的解决方案,因为它可以轻松地处理带有空格和特殊字符的目录名,谢谢这个最终成为我的解决方案,因为它可以轻松地处理带有空格和特殊字符的目录名,谢谢