我想做那样的事情
#!/bin/bash
nb=$(find . -type f -name '*.mp4' | wc -l)
var=0
find . -type f -name '*.mp4' -exec ((var++)) \;
echo $var
但它不起作用?你能救我吗?
答案 0 :(得分:3)
你做不到。每个exec
都在一个单独的过程中执行。这些进程不是shell的一部分,因此无法访问或更改shell变量。 (他们可能会读取 environment 变量,但一旦流程退出,这些变量的更新版本就会丢失;他们无法进行更改。)
如果要修改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)
注意preincrement vs postincrement - 如果您使用set -e
运行脚本,这可以帮助您avoid some gotchas(尽管我认为更好的做法是避免使用“功能”)。< / p>
有关详细信息,请参阅Using Find。
答案 1 :(得分:0)
这是使用find
,而不是选项-exec
,如果您只想在变量中存储找到的项目数量,这样的话就可以了:
#!/bin/bash
var=$(find . -type f -name '*.mp4' | wc -l | awk '{print $1}')
echo $var
答案 2 :(得分:0)
这就是你所需要的:
bash-4.4$ var=$(find . -name "*.mp4" -exec echo {} \;|wc -l)
bash-4.4$ echo $var
4
它计算dir中* .mp4文件的数量,并将数字分配给var。
答案 3 :(得分:0)
-c
中egrep
选项的帮助,短而甜蜜
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 ❱