用多个命令find-exec

我试图用多个命令使用find -exec而没有任何成功。 有没有人知道下列命令是否可行?

find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \; 

基本上,我试图打印当前目录中的每个txt文件的最后一行,并在行尾打印,后面跟着一个逗号。

find接受多个-exec部分的命令。 例如:

 find . -name "*.txt" -exec echo {} \; -exec grep banana {} \; 

请注意,在这种情况下,第二个命令将只在第一个命令成功返回时运行,如@Caleb所述。 如果你想让这两个命令不pipe成功或失败都运行,你可以使用这个构造:

 find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \; 
 find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \; 

以下之一:

 find *.txt -exec awk 'END {print $0 "," FILENAME}' {} \; find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \; find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \; 

有一个更简单的方法:

 find ... | while read -r file; do echo "look at my $file, my $file is amazing"; done 

或者:

 while read -r file; do echo "look at my $file, my $file is amazing"; done <<< "$(find ...)" 

我不知道你是否可以用find来做到这一点,但另一种解决scheme是创build一个shell脚本,并用find来运行它。

lastline.sh:

 echo $(tail -1 $1),$1 

使脚本可执行

 chmod +x lastline.sh 

使用find

 find . -name "*.txt" -exec ./lastline.sh {} \; 

丹尼斯的第一个答案是解决问题的答案。 但事实上,如同标题所暗示的那样,只有一个执行者才能find几个命令。 要用几个命令来回答一个exec,我们将不得不寻找其他parsing的东西。 这里是一个例子:

保留最近7天使用1个exec命令使用几个{}引用修改的最近10000行.log文件

1)看看这个命令将在哪些文件上做什么:

 find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \; 

2)做到这一点:(不要注意“\>”,但只有“>”这是想要的)

find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;

另一种方式是这样的:

 multiple_cmd() { tail -n1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; 

在一行中

 multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; 
  • multiple_cmd() ”是一个函数
  • export -f multiple_cmd ” – 将导出它,所以任何其他的子shell可以看到它
  • find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; ” – find那个会执行你的例子的函数

通过这种方式,multiple_cmd可以像您需要的那样长和复杂。

希望这可以帮助。

应该使用xargs 🙂

 find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT 

另一个(在OSX上工作)

 find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/' 

感谢Camilo Martin,我能够回答一个相关的问题:

我想要做的是

 find ... -exec zcat {} | wc -l \; 

哪个没用 然而,

 find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done 

工作,所以谢谢你!