我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
当前回答
我通常将find嵌入到一个小的for循环一行中,其中find在带有$()的子命令中执行。
你的命令看起来像这样:
for f in $(find *.txt); do echo "$(tail -1 $f), $(ls $f)"; done
好的一点是,你不用{}只用$f,不用-exec…你把所有的命令都写在do和;完成了。
不知道你到底想做什么,但也许像这样?
for f in $(find *.txt); do echo $f; tail -1 $f; ls -l $f; echo; done
其他回答
感谢Camilo Martin,我得以回答一个相关的问题:
我想做的是
find ... -exec zcat {} | wc -l \;
但这并不奏效。然而,
find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
确实有用,所以谢谢!
下列其中一项:
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来做这个,但是另一个解决方案是创建一个shell脚本并用find来运行这个。
lastline.sh:
echo $(tail -1 $1),$1
使脚本可执行
chmod +x lastline.sh
使用找到:
find . -name "*.txt" -exec ./lastline.sh {} \;
另一种方法是这样的:
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" -将导出它,以便任何其他subshell都可以看到它 “找到* . txt - bash - c”multiple_cmd“0”{}\;”-找到将在你的例子中执行函数
通过这种方式,multiple_cmd可以根据您的需要任意长和复杂。
希望这能有所帮助。
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;