我想要做类似于那样的事情
#!/bin/bash
nb=$(find . -type f -name '*.mp4' | wc -l)
var=0
find . -type f -name '*.mp4' -exec ((var++)) \;
echo $var
但是它不起作用?你能帮我吗?
exec
都在一个单独的进程中执行。这些进程不是你的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
,这有助于避免一些陷阱(尽管我认为更好的做法是避免那个“特性”)。这是您需要的吗:
bash-4.4$ var=$(find . -name "*.mp4" -exec echo {} \;|wc -l)
bash-4.4$ echo $var
4
touch $'hello\ncruel\nworld.mp4'; echo hello*.mp4 | wc -l
- Charles Duffy这是使用find
但没有使用-exec
选项,如果您只想将找到的项目数量存储在变量中,类似于以下内容可能会起作用:
#!/bin/bash
var=$(find . -type f -name '*.mp4' | wc -l | awk '{print $1}')
echo $var
awk
,请将单引号放在大括号外面,否则shell会以实现相关的方式处理它们,这可能因shell而异。也就是说:'{print $1}'
,而不是{'print $1'}
。 - Charles Duffy简短而有力,借助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 ❱
find
命令找到的文件数量吗? - Benjamin W.find ... -print | wc -l
并不是所有可能文件名的准确计数。尝试使用touch $'name\nwith\nfour\nlines'
创建一个文件 -- 它将被wc
计算为四个单独的文件。这就是为什么使用 NUL 分隔符更安全(如-print0
)-- 它们不能出现在文件名本身中。 - Charles Duffy