我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
当前回答
find+xargs的答案。
下面的例子找到所有的.html文件,并创建一个附加了. bak扩展名的副本(例如1.html > .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表示输入项为空分隔。
其他回答
find+xargs的答案。
下面的例子找到所有的.html文件,并创建一个附加了. bak扩展名的副本(例如1.html > .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表示输入项为空分隔。
Find命令接受多个-exec部分。例如:
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
注意,在这种情况下,只有当第一个命令成功返回时,第二个命令才会运行,正如@Caleb提到的那样。如果你想让两个命令都运行,不管它们成功或失败,你可以使用这个结构:
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
我不知道你是否可以用find来做这个,但是另一个解决方案是创建一个shell脚本并用find来运行这个。
lastline.sh:
echo $(tail -1 $1),$1
使脚本可执行
chmod +x lastline.sh
使用找到:
find . -name "*.txt" -exec ./lastline.sh {} \;
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;
有一个更简单的方法:
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 ...)"