更新: 谢谢你的回答。正如我所说,我的q只是我的用例的翻译。 让我详细了解我想要实现的目标。 在我的开发环境中,我们使用“ade”作为我们的版本控制系统,我想做的是:
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs -iF ade unbranch F
现在,每次运行unbranch命令时,都会检出一个新的文件/目录。所以我需要在所有的unbranch命令之后运行ade checkin -all。所以我需要像
这样的东西"pre part till sort" | xargs -iF (ade unbranch + ade checkin -all)
如何在管道操作上运行2个命令?
谢谢
原问提问:
我可以将我的用例翻译成以下内容:
我需要获取文件的第一行。我做了
cat file | head -1
现在我想在文件列表中执行此操作。如何在一个unix命令中执行以下操作? 例如:
find . -name "*.log" | ( xargs -iF cat F | head -1 )
显然上述命令中的括号不起作用。
有没有办法管道find命令的输出并在其上执行2个命令(cat和head)?尝试使用;和&&但是帮助。 我可以创建一个脚本 - 但是想在一个命令中执行此操作。
再次 - 这只是我的案例的翻译。
感谢 罗汉
答案 0 :(得分:4)
首先,head
接受多个文件名,因此您只需编写:
head -q -n 1 *.log
或:
find . -name '*.log' -exec head -n 1 '{}' ';'
但是,如果您真的需要复制流,那么请使用tee
并执行以下操作:
wget -O - http://example.com/dvd.iso | tee >(sha1sum > dvd.sha1) > dvd.iso
此示例取自info coreutils 'tee invocation'
。
更新(在ade
评论之后)在您的情况下,tee
将无效。您需要在另一个任务完成后执行任务,tee
将或多或少地同时触发任务(模缓冲)。
另一种方法可行,只要输入行中没有空格(一个严重的问题,我知道,但我现在还不确定如何克服它)。我将从通用解决方案开始:
echo -e 'Foo\nBar\nBaz' | ( for i in `cat` ; do echo 1$i ; echo 2$i ; done )
此处,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 )
答案 1 :(得分:1)
无用地使用cat
。只需将文件名传递给head
:
find . -name '*.log' -exec head -n 1 '{}' '+'
或
find . -name '*.log' -print0 | xargs -0 head -n 1
编辑:这将打印每个文件的标头。在Linux上,可以使用-q
来抑制此操作,但在其他系统上,您必须确保使用单个参数调用head
:
find . -name '*.log' -exec head -n 1 '{}' ';'
答案 2 :(得分:0)
通过将输入汇总到head
而不是简单地给它一个文件名,你使它变得比它需要的复杂得多:
head -n1 `find -X . -name '*.log' | xargs`
如果您不需要遍历子目录,则可以使其更简单:
head -n1 *.log
您可以通过grep:| grep -v '^(==> .* <==)?$' | grep -v '^$'
答案 3 :(得分:0)
尝试
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs sh -c 'ade unbranch "$@"; ade checkin -all "$@"' arg0
这假设ade
一次接受多个文件,并且需要为每个文件调用ade checkin -all
。
字符串arg0
在$0
字符串中提供-c
的值。
答案 4 :(得分:0)
我不知道ade
,所以我将不得不猜测2个命令想要什么
真的跑。但是如果你有GNU Parallel
http://www.gnu.org/software/parallel/安装了其中一个应该
工作:
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ";" ade checkin -all {}
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ";" ade checkin -all
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ; ade checkin -all
如果ade
可以并行投放,则可以删除-j1
。
观看GNU Parallel的介绍视频了解更多信息: http://www.youtube.com/watch?v=OpaiGYxkSuQ