是否可以仅xargs
使用换行符作为分隔符?(如果重要的话,在 Linux 和 OS X 上的 bash 中)
我知道-0
可以使用,但它是 PITA,因为并非每个命令都支持 NUL 分隔的输出。
根据手册页,如果执行行之一以 255 错误退出,则 xargs 将退出:
如果命令的任何调用以 255 的状态退出,xargs 将立即停止而不读取任何进一步的输入。发生这种情况时,会在 stderr 上发出错误消息。
我怎样才能让 xargs不这样做?
我有一个大约 1500 行的批处理作业,我想一次运行 50 行。我发现它总是在某条生产线上死亡,并且没有完成工作。不好!
一个更好的问题,描述我正在尝试做的事情的问题是:
我怎样才能运行一个 1500 行的批处理脚本,一次 50 行,这样它就不会在中间退出作业,并将输出捕获到某种日志文件中?
我的一个常见做法是对某种类型的所有文件执行 grep,例如,找到所有包含“rumpus”一词的 HTML 文件。为此,我使用
find /path/to -name "*.html" | xargs grep -l "rumpus"
Run Code Online (Sandbox Code Playgroud)
有时,find
会返回名称中带有空格的文件,例如my new file.html
. 但是,当xargs
将此传递给grep
时,我收到以下错误:
grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我可以看到这里发生了什么:管道或xargs
正在将空格视为文件之间的分隔符。但是,对于我的一生,我无法弄清楚如何防止这种行为。可以用find
+完成xargs
吗?还是我必须使用完全不同的命令?
例如,使用命令
cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"
Run Code Online (Sandbox Code Playgroud)
将foo.txt
包含两行
foo
bar
Run Code Online (Sandbox Code Playgroud)
上面的命令不打印任何内容。
我有一个包含.patch
文件的目录,使用 diff 生成。
我想将所有这些补丁应用patch -p1
到另一个目录。
但是补丁只需要一个文件,除非我cat
.
使用xargs
或类似工具应用多个文件的命令是什么。
我正在使用 xargs 在一组输入参数上执行命令,如下所示:
cat <someinput> | xargs -n 1 -P 5 <somecmd>
Run Code Online (Sandbox Code Playgroud)
输入文件真的很长,需要很长时间才能运行。所以我只是在等待命令提示符出现。有没有办法显示已完成的输入参数数量的进度条?
我尝试使用“bar”,但我总是得到“无限”的吞吐量。似乎 xargs 在执行命令之前读取整个输入。
如何使用 curl 和 xargs 下载存储在文本文件中的多个文件?这是我最后一次试验:
cat listfile.txt | xargs curl -O
Run Code Online (Sandbox Code Playgroud)
第一个文件运行良好,但其他文件只是输出到标准输出。
出于监控目的,我想找出移动战士 UNIX 机器的所有公共 IPv4 和 IPv6 地址。
请注意,这与在 shell 脚本中查找公共 IP 地址不同,因为有以下额外要求:
我有一个输出 git 存储库 SSH URL 的脚本,如下所示:
git@example.com:namespace/project.git
git@example.com:another_namespace/some_other_project.git
Run Code Online (Sandbox Code Playgroud)
git clone
我想为每一行运行命令(或其他命令)。
我尝试将其通过管道传输到xargs
,但我要么在一行中获得输出,要么将多行输入转储到单个命令。
如何通过管道在每一行上运行任意命令?
如
find -L /etc/ssl/certs/ -type l -exec rm {} +
Run Code Online (Sandbox Code Playgroud)
所以它会找到所有损坏的符号链接并删除它们。但我究竟如何解释这{} +
部分?
大约 10 年前,我问过这个问题
并得到了这个有用的命令 find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'
我决定更多地了解find
,xargs
和sed
语句。在 bash 版本 4.4.20(1)-release 的 Ubuntu 18.04 上,我可以将语句简化为:
find . -type f -print | xargs sed -i 's/regex_search_term/replace_term/g'
然后可以再次简化为:
find . -type f | xargs sed -i 's/regex_search_term/replace_term/g'
所以我的问题是,是否有任何缺点不使用-print0
标志和 -0
国旗find
,并xargs
分别?-print
完全放弃标志有什么缺点吗?它们是否明确用于与不同的类 Unix 系统兼容?
我有一个很简单的问题,我想在这里解决。我不断在域上运行 (host) 命令以获取它们的 IP,然后再次在这些 IP 上运行 (host) 命令以获取它们的 PTR,然后我通过 SSH 连接到 PTR 中表示的服务器:
[root@box ~]$ host DomainIWant.com
DomainIWant.com has address 123.123.123.123
[root@box ~]$ host 123.123.123.123
123.123.123.123.in-addr.arpa domain name pointer vps2010.DomainIWantHosts.com
[root@box ~]$ ssh vps2010.DomainIWantHosts.com
Run Code Online (Sandbox Code Playgroud)
够简单了吧?一遍又一遍地做这件事很乏味,所以对于所有 Linux 我想通过自动化来加速它:
[root@box ~]$ host DomainIWant.com | awk '{print $4}' | xargs host | awk '{print $5}' | xargs ssh -tt
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我通过 xargs 调用 ssh 时,我确实通过 SSH 连接到远程服务器,但出现错误 [tcgetattr: Invalid argument]。我坐在远程服务器的外壳上,但是当我尝试运行任何命令时,它只是挂起,最终我必须按 Ctrl-C 才能摆脱它。
如果我不添加 (ssh -tt),那么我会收到一个 [Pseudo-terminal will not be allocation because stdin is not …
我在文本文件中有一个巨大的文件列表。这个列表被传递给 tar,像这样:
猫列表.txt | xargs tar rvf archive.tar --ignore-failed-read
问题是列表中的某些文件不再存在。所以 tar 一直说“无法统计:没有这样的文件或目录......”。我对此没有任何问题,但是当出现其中一些消息时,tar 挂起,并等待几分钟恢复操作,使备份非常缓慢。关于如何仅将现有文件过滤为 tar 的任何想法?
问候