如何组合以下两个命令:
find . -print0 | grep -z pattern | tr '\0' '\n'
find . -print0 | grep -z pattern | xargs -0 my_command
进入单一管道?如果我不需要NUL分隔符,那么我可以这样做:
find . | grep pattern | tee /dev/tty | xargs my_command
我想避免使用这样的临时文件:
find . -print0 | grep -z pattern > tempfile
cat tempfile | tr '\0' '\n'
cat tempfile | xargs -0 my_command
rm tempfile
这个问题是对这些答案的后续跟进:
1)使用/ dev / tty显示中间管道结果:
https://unix.stackexchange.com/a/178754/8207082
2)使用NUL分隔的文件列表:
https://stackoverflow.com/a/143172/8207082
编辑使用my_command
代替command
。
后续问题:
答案 0 :(得分:5)
你可以改变tee指向proc sub,然后在那里做同样的事情。
find . -print0 | grep -z pattern | tee >(tr '\0' '\n' > /dev/tty) | xargs -0 command
以这种方式使用tee的唯一问题是,如果xargs命令也打印到屏幕,那么所有输出都可能混乱,因为管道和进程子都是异步的。
答案 1 :(得分:1)
其中一种可能性:
find . -print0 | grep -z pattern | { exec {fd}> >(tr '\0' '\n' >/dev/tty); tee "/dev/fd/$fd"; } | xargs -0 command
我们在飞行中创建一个临时文件描述符fd
,其中exec
通过标准进程替换连接到tr
的stdin。 tee
将所有内容传递给stdout(以xargs
结尾),并将副本传递给输出到tr
的{{1}}子进程。
答案 2 :(得分:-1)