如何使用find -exec增加?

时间:2017-09-25 19:54:26

标签: bash shell increment

我想做那样的事情

#!/bin/bash

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

但它不起作用?你能救我吗?

4 个答案:

答案 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 ❱