使用多个命令查找-exec

问题描述 投票:0回答:14

我尝试将 find -exec 与多个命令一起使用,但没有成功。有谁知道是否可以执行以下命令?

find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;

基本上,我试图打印当前目录中每个txt文件的最后一行,并在行尾打印一个逗号,后跟文件名。

bash find
14个回答
940
投票

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

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

请注意,在这种情况下,只有第一个命令成功返回,第二个命令才会运行,正如 @Caleb 提到的。如果您希望这两个命令无论成功或失败都运行,您可以使用以下构造:

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

149
投票
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;

75
投票

以下其中一项:

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"' _ {} \;

36
投票

另一种方法是这样的:

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 可以根据需要变得尽可能长和复杂。


26
投票

有一个更简单的方法:

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 ...)"

13
投票

扩展@Tinker的答案,

就我而言,我需要在

command | command | command
内创建一个
-exec
来打印文件名和在包含特定文本的文件中找到的文本。

我能够做到这一点:

find . -name config -type f \( -exec  grep "bitbucket" {} \; -a -exec echo {} \;  \) 

结果是:

    url = [email protected]:a/a.git
./a/.git/config
    url = [email protected]:b/b.git
./b/.git/config
    url = [email protected]:c/c.git
./c/.git/config

9
投票

我不知道是否可以使用 find 来完成此操作,但替代解决方案是创建一个 shell 脚本并使用 find 来运行它。

lastline.sh:

echo $(tail -1 $1),$1

使脚本可执行

chmod +x lastline.sh

使用

find

find . -name "*.txt" -exec ./lastline.sh {} \;

7
投票

感谢卡米洛·马丁(Camilo Martin),我能够回答相关问题:

我想做的是

find ... -exec zcat {} | wc -l \;

这不起作用。然而,

find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done

确实有效,所以谢谢你!


5
投票

Denis的第一个回答是解决问题的答案。但事实上,它不再是像标题所暗示的那样,在一个 exec 中找到多个命令。要回答一个执行多个命令的问题,我们将不得不寻找其他问题来解决。这是一个例子:

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

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" \;


3
投票

我通常将

find
嵌入到一个小的
for
循环中,其中查找是在带有
$()
的子命令中执行的。

你的命令将如下所示:

for f in $(find *.txt); do echo "$(tail -1 $f), $(ls $f)"; done

好处是,您只需使用

{}
而不是
$f
,而不是
-exec …
,您可以在
do
; done
之间编写所有命令。

不确定你真正想做什么,但也许是这样的?

for f in $(find *.txt); do echo $f; tail -1 $f; ls -l $f; echo; done

3
投票

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

您可以使用“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

2
投票

一个

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

使用空字节终止符对结果进行管道传输。




对于
xargs

-print0 参数将

-I {}
定义为占位符;您可以使用任何您喜欢的占位符;
{}
表示输入项以 null 分隔。

    


1
投票

-0

另一个(在 osx 上工作)

find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT



0
投票

使用示例。此命令将

find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/'

linux 命令应用于每个找到的文件:

file

查找器脚本:

./finder.sh file fb2 txt

© www.soinside.com 2019 - 2024. All rights reserved.