简单bash递归

简单bash递归,bash,Bash,我正在编写非常简单的bash脚本来更改 .html文件,并希望递归处理目录。 该函数仅适用于一级目录。 你能告诉我哪里错了吗?这是我的密码 #!/bin/bash handleFiles () { local REGEXP='.+\.html$' echo $1 for f in $1/* do if [[ -d $f ]] then handleFiles "$f" elif [[ $f =~ $REGEXP ]] then

我正在编写非常简单的bash脚本来更改 .html文件,并希望递归处理目录。 该函数仅适用于一级目录。 你能告诉我哪里错了吗?这是我的密码

#!/bin/bash

handleFiles () { 
 local REGEXP='.+\.html$'
 echo $1
 for f in $1/*
  do
   if  [[ -d $f ]]
      then
       handleFiles "$f"
   elif [[ $f =~ $REGEXP ]]
      then 
       echo "Converting $f"
       enconv -L bg -x UTF-8 "$f" 
   fi
 done
}

# The script show all .html files in test
# enter into subdirectory but not working .. 
handleFiles "test"
以下是测试目录的结构:

test$ tree 
.
├── test.html
└── Untitled Folder
    └── test1.html

1 directory, 2 files
运行脚本时,我得到以下输出:

 ./converter.sh 
test
Converting test/test.html
test/Untitled Folder
总而言之,我发布了我的最终解决方案。我希望这对有类似问题的人有用

#!/bin/bash

########################################################
#   This bash script assume directory as a argument
#   and convert all  .html,js and xml files from 
#   windows-1251 encoding into utf-8 encoding. 
#   @author Georgi Naumov 
#   @email gonaumov@gmail.com for contacts and 
#   suggestions. 
########################################################

if [[ $# -ne 1 ]] ; then
    echo "Usage $0 <<directory to change encoding reqursively>>"
    exit 1
fi

handleFiles () { 
 local REGEXP='.+\.(html|js|xml)$'
 for f in "$1"/*
  do
   if  [[ -d "$f" ]]
      then
       handleFiles "$f"
   elif [[ "$f" =~ $REGEXP ]]
      then 
       echo "Converting $f"
       enconv -L bg -x UTF-8 "$f" 
   fi
 done
}

handleFiles "$1"
#/bin/bash
########################################################
#此bash脚本假定目录为参数
#并将所有.html、js和xml文件从
#windows-1251编码转换为utf-8编码。
#@作者Georgi Naumov
#@emailgonaumov@gmail.com联系方式和
#建议。
########################################################
如果[$#-ne 1]];然后
回显“使用率$0”
出口1
fi
handleFiles(){
local REGEXP='.+\.(html | js | xml)$'
对于“$1”中的f/*
做
如果[-d“$f”]]
然后
扶手文件“$f”
elif[“$f”=~$REGEXP]]
然后
echo“转换$f”
enconv-L bg-x UTF-8“$f”
fi
完成
}
扶手文件“$1”

整个方法比必要的要复杂得多。我建议使用
查找

find test -name '*.html' -exec enconv -L bg -x UTF-8 '{}' \;

如果您想手动执行此操作,则必须将
$f
放在双引号中(即,
“$f”
),否则,正如您所注意到的,如果目录包含空格,则会中断,因为shell会将其扩展为两个(或更多,视情况而定)单独的标记。

整个方法比必要的方法复杂得多。我建议使用
查找

find test -name '*.html' -exec enconv -L bg -x UTF-8 '{}' \;

如果您想手动执行此操作,则必须将
$f
放在双引号中(即,
“$f”
),否则,正如您所注意到的,如果目录中包含空格,它将断开,因为shell会将其扩展为两个(或更多,视情况而定)单独的标记。

还引用
$1
来处理空格(例如,
无标题文件夹
):


引用
$1
来处理空白(例如
无标题文件夹
):


这是一个练习,还是您对转换文件的更简单方法感兴趣?我写这篇文章只是为了转换一个目录中的多个文件,但希望改进处理嵌套目录递归的解决方案。Quote
$f
with
处理带空格的目录(例如,无标题文件夹)。我添加了”但是test1.html再次没有被处理。请看:这是一个练习,还是您对转换文件的更简单方法感兴趣?我写这篇文章只是为了转换一个目录中的多个文件,但希望改进处理嵌套目录递归的解决方案。Quote
$f
with
“”
处理带有空格的目录(例如,无标题文件夹)。我添加了“”,但test1.html再次未被处理。看一看:因此解决方案更好,但我想知道为什么我的解决方案不起作用+1。将
$1
也放在引号中,即在“$1”中为I添加
/*
,因为
$1
最终也会包含空格。谢谢您的时间。根据
enconv
可以接受多个文件参数,因此将
\;
更改为
+
可能会加快速度。因此解决方案更好,但我想知道为什么我的解决方案不起作用+1。将
$1
放入>在引号中,也就是“$1”中的i的
/*
,因为
$1
最后也会包含空格。谢谢您的时间。根据
enconv
可以接受多个文件参数,因此将
\;
更改为
+
可能会加快速度。谢谢。我只想知道我的解决方案为什么不能正常工作。谢谢。我只想知道为什么我的解决方案不能正常工作。