在bash中遍历文件用
for file in * ; do ... done很多教科书上用: for file in $(commmand ls *) ,但这种方法不能正确处理文件名中包含$IFS指定的分隔符,即便ls 用 --quoting-style=shell 限定也没有用。
用for file in * ; 的缺点是不能处理隐藏文件或目录
完整源码如下:
#!/bin/bash declare -r tab="---" declare -r lead="|" function recdir { declare -i cbfiles=0 declare -a files local thistab="$2"$lead$tab cd "$1" # get how many files in this directory for file in * ; do files[$(( cbfiles++ ))]="$file" done declare -i curr=0 for file in "${files[@]}" ; do curr=$((++curr)) echo "$thistab$file" if [ -d "$file" ]; then space=${tab//-/' '} ll="" if [ $(( curr < cbfiles )) = 1 ]; then ll=$2$lead"${space}" else ll="$2 ${space}" fi recdir "$file" "$ll" fi done cd ".." } rootdir=${1:-.} rootdir=${rootdir%/} if [ -d "$rootdir" ]; then echo "$rootdir" recdir $rootdir else echo "$rootdir is not a directory." fi unset rootdir
执行结果如下:
. |---CRFSC_Manual.pdf |---foo1 |---foo1~ |---p1_b.jpg |---p1.jpg |---p2.jpg |---p3.jpg |---studynote | |---Match Waveform Theory Notebook.odt | |---test.txt | |---whh | |---a.txt |---SWIGDocumentation.pdf |---科学和特异功能.odt
No comments:
Post a Comment