用多个命令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
工作,所以谢谢你!