我正在尝试使用find -exec的多个命令,但没有任何成功。 有谁知道像下面这样的命令是否可行?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我想打印当前目录下每个txt文件的最后一行,并在行末打印一个逗号,然后是文件名。
find
接受多个-exec
部分的命令。比如说。
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
注意,在这种情况下,只有当第一个命令成功返回时,第二个命令才会运行,正如@Caleb所提到的。如果你想让两个命令都运行,而不考虑其成败,你可以使用这个结构。
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
以下其中一项。
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"' _ {} \;
另一种方法是这样的。
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"' {}. \
"--找到将在你的例子上执行的函数这样一来,multiple_cmd就可以根据你的需要变得很长、很复杂。
希望这有帮助。
感谢卡米洛-马丁,我得以回答一个相关问题。
我想做的是
find ... -exec zcat {} | wc -l \;
其中没有'工作。 不过。
find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
确实有效,所以谢谢你!
Denis的第一个答案是解决这个问题的答案。 但事实上,它并不像标题所说的那样,只是在一个exec中找到了几个命令。 要回答一个exec中包含多个命令的问题,我们必须寻找其他东西来解决。 下面是一个例子。
用一个exec命令保存过去7天内修改过的最后10000行.log文件,使用severals {}引用。
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".mtime -7 -exec sh -c "tail -10000 {}; fictmp; cat fictmp > {} ; rm fictmp" \;
一个find+xargs
的答案。
下面的例子找到所有.html
文件,并创建一个附加.BAK
扩展名的副本(例如:)
1.html
>
1.html.BAK
)。)
find . -iname "*.html" -print0 | xargs -0 -I {} cp -- "{}" "{}.BAK"
find . -iname "*.html" -print0 | xargs -0 -I {} echo "cp -- {} {}.BAK ; echo {} >> /tmp/log.txt" | sh
# if you need to do anything bash-specific then pipe to bash instead of sh
这个命令也可以处理以连字符开头或包含空格的文件,如-my file.html
,这要归功于参数引号和cp
后面的--
,它向cp
发出了参数结束和实际文件名开始的信号。
-print0
用空字节结束符将结果管道化。
对于xargs,
-I {}
参数定义了{}
作为占位符。 你可以使用任何你喜欢的占位符。-0
表示输入项是空分的。