将xargs的输出重定向到文件

8
我想要删除目录中每个文件的第一行,并将相应的输出保存为在文件名末尾添加“.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 输出重定向是其参数的一部分呢?
2个回答

3
注意,你可以使用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

1
如果文件名由恶意人士制作,则从find运行'sh -c'是危险的。在运行上述命令之前,请尝试使用touch 'foo; echo Naughty naughty - I could have removed a file' - Ole Tange
4
这是 xargs 命令的一个良好替代品,但实际上并不是问题的答案。 - Derek Greer
正确答案是你不能用xargs来做这个。这里有一个相关的讨论:https://stackoverflow.com/a/38834168/1334781 - undefined

2
如果您有GNU Parallel,您可以运行以下命令:
find . -type f | parallel tail -n +2 {} '>' {}.tmp

所有新的计算机都有多个核心,但大多数程序是串行的,并且因此不会使用多个核心。然而,许多任务可以被极大地并行化:
- 在许多文件上运行相同的程序 - 在文件的每一行上运行相同的程序 - 在文件的每个块上运行相同的程序
GNU Parallel 是一个通用的并行化工具,可以轻松地在同一台机器或您拥有 ssh 访问权限的多台机器上并行运行作业。
如果您有 32 个不同的作业想要在 4 个 CPU 上运行,一种简单的并行化方法是在每个 CPU 上运行 8 个作业:
简单调度图像
相反,GNU Parallel 在一个进程完成时生成一个新进程 - 保持 CPU 活动状态,从而节省时间:
GNU Parallel 调度图像 安装 个人安装不需要 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 运行该命令。 #叹息 - Bruno Bronosky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接