我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图打印当前目录中每个txt文件的最后一行,并打印在行末,逗号后跟文件名。
当前回答
我不知道你是否可以用find来做这个,但是另一个解决方案是创建一个shell脚本并用find来运行这个。
lastline.sh:
echo $(tail -1 $1),$1
使脚本可执行
chmod +x lastline.sh
使用找到:
find . -name "*.txt" -exec ./lastline.sh {} \;
其他回答
扩展@Tinker的回答,
在我的例子中,我需要在-exec中创建一个命令|命令|命令来打印文件名和在包含特定文本的文件中找到的文本。
我可以用:
find . -name config -type f \( -exec grep "bitbucket" {} \; -a -exec echo {} \; \)
结果是:
url = git@bitbucket.org:a/a.git
./a/.git/config
url = git@bitbucket.org:b/b.git
./b/.git/config
url = git@bitbucket.org:c/c.git
./c/.git/config
我通常将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 . -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" \;
应该使用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 ' ' '/'