简单bash递归
我正在编写非常简单的bash脚本来更改 .html文件,并希望递归处理目录。 该函数仅适用于一级目录。 你能告诉我哪里错了吗?这是我的密码简单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
#!/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
可以接受多个文件参数,因此将\;
更改为+
可能会加快速度。谢谢。我只想知道我的解决方案为什么不能正常工作。谢谢。我只想知道为什么我的解决方案不能正常工作。