【问题标题】:Redirect output of xargs to file将 xargs 的输出重定向到文件
【发布时间】:2014-11-22 21:44:05
【问题描述】:

我想删除目录中每个文件的第一行,并通过在每个文件名的末尾附加一个“.tmp”来保存相应的输出。例如,如果有一个名为input.txt 的文件,其内容如下:

line 1
line 2

我想在同一目录中创建一个名为 input.txt.tmp 的文件,其内容如下

line 2

我正在尝试这个命令:

find . -type f | xargs -I '{}' tail -n +2 '{}' > '{}'.tmp

问题是,它不是将输出写入带有.tmp 后缀的单独文件,而是只创建一个名为{}.tmp 的文件。我知道这是因为输出重定向是在 xargs 完全完成之后完成的。但是有什么方法可以告诉xargs 输出重定向是它的论点的一部分?

【问题讨论】:

    标签: bash find xargs


    【解决方案1】:

    请注意,您可以将find-exec 一起使用,而无需通过管道传递给xargs

    find . -type f -exec sh -c 'f={}; tail -n+2 $f > $f.tmp' \;
                                ^^^^  ^^^^^^^^^^^^^^^^^^^^^
                                  |   perform the tail and redirection
                      store the name of the file
    

    【讨论】:

    • find 运行 'sh -c' 如果文件名是由邪恶的人创建的,则很危险。在运行上述之前尝试:touch 'foo; echo Naughty naughty - I could have removed a file'
    • 这是 xargs 命令的一个很好的替代品,但它实际上并不是问题的答案。
    【解决方案2】:

    如果你有 GNU Parallel,你可以运行:

    find . -type f | parallel tail -n +2 {} '>' {}.tmp
    

    所有新计算机都有多个内核,但大多数程序本质上是串行的,因此不会使用多个内核。然而,许多任务是极其可并行化的:

    • 对多个文件运行相同的程序
    • 为文件中的每一行运行相同的程序
    • 为文件中的每个块运行相同的程序

    GNU Parallel 是一种通用的并行化器,可以轻松地在同一台机器上或在您可以通过 ssh 访问的多台机器上并行运行作业。

    如果您想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

    GNU Parallel 会在完成后生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

    安装

    个人安装不需要 root 访问权限。这样做可以在 10 秒内完成:

    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
       fetch -o - http://pi.dk/3 ) > install.sh
    $ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
    12345678 883c667e 01eed62f 975ad28b 6d50e22a
    $ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
    cc21b4c9 43fd03e9 3ae1ae49 e28573c0
    $ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
    79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
    fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
    $ bash install.sh
    

    有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

    了解详情

    查看更多示例:http://www.gnu.org/software/parallel/man.html

    观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    浏览教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

    注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

    【讨论】:

    • 别忘了运行一次parallel --bibtex 并在提示符处键入will cite 以使引用通知静音,而不必每次都以parallel --citation 运行命令。 #叹息
    猜你喜欢
    • 2015-12-03
    • 2018-09-25
    • 2016-08-09
    • 2013-10-11
    • 2023-03-19
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多