【问题标题】:Bash Shell awk/xargs magicBash Shell awk/xargs 魔法
【发布时间】:2011-12-26 18:06:46
【问题描述】:

我正在尝试学习一点 awk foo。我有一个 CSV,其中每一行的格式为 partial_file_name,file_path。我的目标是找到文件(基于部分名称)并将它们移动到各自的新路径。我想结合 find、awk 和 mv 的力量来实现这一点,但我坚持实施。我想使用 awk 将术语与 csv 文件分开,以便我可以执行类似
find . -name '*$1*' -print | xargs mv {} $2{}
之类的操作 其中 $1 和 $2 是 csv 文件中的拆分项。有人有什么想法吗?
-和平

【问题讨论】:

    标签: bash awk xargs


    【解决方案1】:
    find . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}
    

    【讨论】:

      【解决方案2】:

      您实际上并不需要 awk。 awk 没有比 shell 做得更好的了。

      #!/bin/sh
      IFS=,
      while read file target; do
        find . -name "$file" -print0 | xargs -ir0 mv {} "$target"
      done <path_to_csv_file
      

      如果文件名中有特殊字符,您可能需要调整 read

      【讨论】:

        【解决方案3】:

        我认为你把事情搞混了。 {} 只能在 find 中使用,而且只能使用一次。即你不能做类似find -name '*.jpg' -exec mv {} {}.png的事情。

        这样做:

        $ cat korv
        foo.txt,/hello/
        bar.jpg,/mullo/
        $ awk -F, '{print $1 " " $2}' korv
        foo.txt /hello/
        bar.jpg /mullo/
        

        -F 设置分隔符,因此上面将使用“,”进行拆分。接下来,将 * 添加到文件名:

        $ awk -F, '{print "*"$1"*" " " $2}' korv
        *foo.txt* /hello/
        *bar.jpg* /mullo/
        **
        

        这表明我有一个空行。我们不想要这个匹配,所以我们添加一个规则:

        $ awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv
        *foo.txt* /hello/
        *bar.jpg* /mullo/
        

        看起来不错,所以使用子外壳将所有这些封装到 mv 中:

        $ mv $(awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv)
        $
        

        完成。

        【讨论】:

        • 是的,我有点搞混了。很酷的解决方案和很好的解释。非常感谢
        • 不,xargs -i 当然也支持 {},但它一次接受一个参数。
        • echo foo | xargs -n 1 echo mv {} {}.txt => "mv {} {}.txt foo" 给我。
        • 你忘记了xargs -i中的-i
        • 您可以多次使用{},例如。 find . -name file -exec mv {} {}.txt \; 有效。
        【解决方案4】:

        使用awk的系统命令怎么样:

        awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'
        

        csv 文件中的示例参数:test.txt ./subdirectory/

        【讨论】:

        • 感谢您的帮助。不知道那个命令。那么完整的通话看起来像:awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }' path_to_csv_file?
        • 最后一个 '"{}"' 是干什么用的?至少对我来说,如果你把它拿出来效果会更好。
        • @adbo:使用 -F 运行它,获取 csv 文件。 Bos 的解决方案要好得多,假设您只想复制当前目录中的文件(在这种情况下 find 变得完全没有必要)。
        • @tripleee:虽然它仍然适用于最后一个 {},但您说得对,它没有必要。 mv file.txt ./subdir/file.txt 的工作方式与 mv file.txt ./subdir/ 相同。回想起来,我会把它拿出来。
        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 2017-07-25
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2014-04-26
        • 2011-05-02
        相关资源
        最近更新 更多