如何使用find -exec进行增量操作?

6

我想要做类似于那样的事情

#!/bin/bash

nb=$(find . -type f -name '*.mp4' | wc -l)
var=0
find . -type f -name '*.mp4' -exec ((var++)) \;
echo $var

但是它不起作用?你能帮我吗?

“nb” 有什么作用?你想要运行什么命令?你想要达到什么目标? - Benjamin W.
您想统计由您的find命令找到的文件数量吗? - Benjamin W.
顺便提一下,find ... -print | wc -l 并不是所有可能文件名的准确计数。尝试使用 touch $'name\nwith\nfour\nlines' 创建一个文件 -- 它将被 wc 计算为四个单独的文件。这就是为什么使用 NUL 分隔符更安全(如 -print0)-- 它们不能出现在文件名本身中。 - Charles Duffy
是的。我想说我在一些没有“-printf”的非GNU“find”中看到了“-print0”。(实际上 - 经证实:MacOS有“-print0”但没有“-printf”)。 - Charles Duffy
好的,但我应该把printf或print0放在哪里? - romainlavisse
显示剩余3条评论
4个回答

6
你做不到。每个exec都在一个单独的进程中执行。这些进程不是你的Shell的一部分,因此它们无法访问或更改Shell变量。(它们可能潜在地读取环境变量,但更新后的这些变量将在进程退出时丢失;它们无法进行更改)。
如果您想修改Shell状态,则需要在Shell本身中进行操作。因此:
#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; do not run as "sh scriptname"

while IFS= read -r -d '' filename; do
  ((++var))
done < <(find . -type f -name '*.mp4' -print0)

注意前置递增和后置递增的区别--如果你在运行脚本时使用set -e,这有助于避免一些陷阱(尽管我认为更好的做法是避免那个“特性”)。
详见使用Find

1

这是您需要的吗:

bash-4.4$ var=$(find . -name "*.mp4" -exec echo {} \;|wc -l)                                                                                                                        
bash-4.4$ echo $var                                                                                                                                                                 
4   

它计算目录内 *.mp4 文件的数量,并将该数字赋值给变量。

文件名可以包含换行符--在这种情况下,理想的答案应避免重复计数。 - Charles Duffy
要自行测试,请运行以下命令:touch $'hello\ncruel\nworld.mp4'; echo hello*.mp4 | wc -l - Charles Duffy

0

这是使用find但没有使用-exec选项,如果您只想将找到的项目数量存储在变量中,类似于以下内容可能会起作用:

#!/bin/bash

var=$(find . -type f -name '*.mp4' | wc -l  | awk '{print $1}')

echo $var 

1
如果您想确保大括号被传递给awk,请将单引号放在大括号外面,否则shell会以实现相关的方式处理它们,这可能因shell而异。也就是说:'{print $1}',而不是{'print $1'} - Charles Duffy
我的脚本的第一行已经做到了那个。我想知道每次我得到一个“.mp4”时,我想要增加一个计数。 - romainlavisse

0

简短而有力,借助egrep中的-c选项

ALP ❱ find . | egrep mp4$
./T/How_to_Use_Slang_at_the_Market_English_Lessons.mp4
./T/How_to_Use_Slang_on_the_Road_English_Lessons.mp4
./T/How_to_Use_Slang_on_Vacation_English_Lessons.mp4
./T/How_to_Use_Slang_at_the_Airport_English_Lessons.mp4
./T/How_to_Use_Slang_to_Talk_about_Health_English_Lessons.mp4
./list-mp4
ALP ❱ find . | egrep -c mp4$
6
ALP ❱ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接