說明
運(yùn)行環(huán)境:Windows 10
本文收集一些shell腳本常用的遍歷文件的使用示例沿后。
1.常用語句
數(shù)組拼接與遍歷
array[${#array[*]}]=123
array[${#array[*]}]=abc
array[${#array[*]}]="string"
for (( i = 0; i < ${#array[*]}; ++i ))
do
echo ${array[i]}
done
字符串拼接與遍歷
paths="$paths header/"
paths="$paths include/"
for (( i = 0; i < ${#paths[*]}; ++i ))
do
echo ${paths[i]}
done
遞歸查找文件
find ./ -name "*.*"
遞歸查找多種后綴的文件
find ./ -regex ".*\.\(sh\|md\)"
將命令行輸出結(jié)果保存到變量中
szResult=`file --mime-encoding README.md`
echo $szResult
或:
szResult=$(file --mime-encoding README.md)
echo $szResult
獲取上一條命令的運(yùn)行結(jié)果
使用$?
獲取數(shù)值結(jié)果。與獲取輸出結(jié)果不同坯汤。
字符串匹配判斷
szResult=`file --mime-encoding README.md`
hasUTF8=`echo $szResult | awk '{print match($0, utf-8)}'`
echo $hasUTF8
if [[ $hasUTF8 -gt 0 ]];
then
echo README.md is UTF-8
fi
文件或文件夾判斷
if test -f $file
then
echo $file is a file.
elif test -d $file
then
echo $file is a directory.
fi
2.基本遍歷
遍歷一級文件
需要同時(shí)遍歷文件夾時(shí)默怨,通配符改為
*
for file in *.*
do
echo $file
done
遞歸遍歷文件
需要同時(shí)遍歷文件夾時(shí),通配符改為
*
for file in `find ./ -name "*.*"`
do
echo $file
done
3.搭配使用
批量轉(zhuǎn)碼
例如,我們需要將UTF-8的h文件和cpp文件轉(zhuǎn)換成ascii姆钉。
這里我們需要從$?
獲取iconv
命令的運(yùn)行結(jié)果來判斷,是否運(yùn)行成功抄瓦,避免僅轉(zhuǎn)換到半截文本潮瓶。
szRootPath=./
szFileFilter=".*\.\(h\|cpp\)"
for file in `find $szRootPath -regex "$szFileFilter"`
do
szResult=`file --mime-encoding $file`
hasUTF8=`echo $szResult | awk '{print match($0, utf-8)}'`
if [[ $hasUTF8 -gt 0 ]];
then
szIconvResult=$(iconv -f UTF-8 -t GB2312 $file > UTF-8_FILE)
if [[ $? -eq 0 ]];
then
echo $szResult
cp UTF-8_FILE $file
else
echo $szIconvResult
fi
fi
done
VSCode使用一鍵輸入代碼進(jìn)行快速編寫
可將下方的基本遍歷的代碼直接配置到shellscript.json中,方便隨時(shí)編寫使用
{
"for_iterate_files_recursively" : {
"prefix": "forfr",
"body": [
"for file in `find ./ -name \"*.*\"` ",
"do",
" echo $$file",
"done",
],
"description": "遞歸遍歷文件"
},
"for_iterate_files" : {
"prefix": "forf",
"body": [
"for file in *.*",
"do",
" echo $$file",
"done",
],
"description": "遍歷一級文件"
},
}