【问题标题】:Linux Script to move directories containing a file用于移动包含文件的目录的 Linux 脚本
【发布时间】:2013-10-17 17:57:56
【问题描述】:

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

我有一个命令,可以在此处为我提供符合我的条件的目录列表:

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

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

【问题讨论】:

    标签: linux bash scripting grep


    【解决方案1】:

    您可以将xargs 与替换一起使用以获得所需的效果:

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

    【讨论】:

    • 这个最终成为我的解决方案,因为它可以轻松处理带有空格和特殊字符的目录名称,谢谢
    【解决方案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 它不需要移动目录,它会“序列化”你的管道,直到找到 finished 才能进行排序,所以移动不会开始,没有它,移动可以尽快开始找到第一项。

    【讨论】:

    • 好吧,它一直有效,直到我的目录名称中有空格...最终使用下面的 xargs 选项
    • 'mv "$line" "$target"' 但同意 xargs 选项在这里更好 这虽然读取结构 can 对于复杂的处理很有用,但我需要使用 xargs更多
    【解决方案3】:

    backtick operator 评估命令并将stdout 放置在就像您在命令行中输入它一样。所以,在你的情况下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多