我试图使用查找-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

其他回答

我找到了这个解决方案(可能已经在评论中说过了,但我找不到任何答案)

你可以使用bash -c在一行中执行多个命令

find . <SOMETHING> -exec bash -c "EXECUTE 1 && EXECUTE 2 ; EXECUTE 3" \;

在你的情况下

find . -name "*.txt" -exec bash -c "tail -1 '{}' && ls '{}'" \;

我用一个测试文件测试了它:

 [gek@tuffoserver tmp]$ ls *.txt


casualfile.txt
[gek@tuffoserver tmp]$ find . -name "*.txt" -exec bash -c "tail -1 '{}' && ls '{}'" \;
testonline1=some TEXT
./casualfile.txt
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;

丹尼斯的第一个答案是解决问题的答案。但事实上,它不再像标题所暗示的那样,在一个exec中找到几个命令。要回答一个exec与几个命令的事情,我们将不得不寻找其他东西来解决。这里有一个例子:

保留在过去7天内使用一个exec命令使用几个{}引用修改的.log文件的最后10000行

1)看看这个命令会对哪些文件做什么:

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

2)这样做:(注意没有更多的“\>”,而只有“>”,这是需要的)

查找/ -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp;Cat fictmp > {};Rm fictmp" \;

我通常将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

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

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

注意,在这种情况下,只有当第一个命令成功返回时,第二个命令才会运行,正如@Caleb提到的那样。如果你想让两个命令都运行,不管它们成功或失败,你可以使用这个结构:

find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;