更新:感谢您的回答.正如我所说,我的q只是我的用例的翻译.让我详细了解我想要实现的目标.在我的开发环境中,我们使用"ade"作为我们的版本控制系统,我想要做的是:
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs -iF ade unbranch F
Run Code Online (Sandbox Code Playgroud)
现在,每次运行unbranch命令时,都会检出一个新的文件/目录.所以我需要在所有的unbranch命令之后运行ade checkin -all.所以我需要类似的东西
"pre part till sort" | xargs -iF (ade unbranch + ade checkin -all)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在管道上运行2个命令?
谢谢
原问提问:
我可以将我的用例翻译成以下内容:
我需要获取文件的第一行.我做
cat file | head -1
Run Code Online (Sandbox Code Playgroud)
现在我想在文件列表上执行此操作.如何在一个unix命令中执行以下操作?例如:
find . -name "*.log" | ( xargs -iF cat F | head -1 )
Run Code Online (Sandbox Code Playgroud)
显然上面命令中的括号不起作用.
有没有办法管道find命令的输出并在其上做两个命令(猫和头)?尝试使用; 和&&但帮助.我可以创建一个脚本 - 但是想在一个命令中执行此操作.
再次 - 这只是我的案例的翻译.
谢谢罗汉
首先,head
接受多个文件名,所以你可以简单地写:
head -q -n 1 *.log
Run Code Online (Sandbox Code Playgroud)
或者:
find . -name '*.log' -exec head -n 1 '{}' ';'
Run Code Online (Sandbox Code Playgroud)
但是,如果您确实需要复制流,请使用tee
并执行以下操作:
wget -O - http://example.com/dvd.iso | tee >(sha1sum > dvd.sha1) > dvd.iso
Run Code Online (Sandbox Code Playgroud)
这个例子取自info coreutils 'tee invocation'
.
更新(根据ade
评论)在你的情况下tee
将不起作用。您需要在另一个任务完成后执行一个任务,并且tee
会或多或少同时触发这些任务(模缓冲)。
如果输入行中没有空格,另一种方法将起作用(我知道这是一个严重的问题,但我现在不确定如何克服它)。我将从一个通用的解决方案开始:
echo -e 'Foo\nBar\nBaz' | ( for i in `cat` ; do echo 1$i ; echo 2$i ; done )
Run Code Online (Sandbox Code Playgroud)
在这里,echo -e 'Foo\nBar\nBaz'
创建一个示例多行输入,echo 1$i
是要运行的第一个命令,echo 2$i
是要运行的第二个命令。
我不熟悉ade
,也没有在我的系统上安装它,但我猜在你的情况下,这样的东西可能会起作用:
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | ( for i in `cat` ; do ade unbranch $i ; ade checkin -all $i ; done )
Run Code Online (Sandbox Code Playgroud)