包含空格的檔名未正確列出

包含空格的檔名未正確列出

我有來自下面腳本的以下程式碼,該程式碼應該捕獲ls -l當前目錄的輸出並丟棄寫入總計的第一行。然後將每個檔案的權限、擁有者和檔案名稱以及最後的總行數輸出到終端。問題是,如果目錄中存在名稱中包含空格的文件,則該文件未正確列出。為什麼不?

list=`ls -l`

IFS_old=$IFS
IFS=$'\n'
i=0
for row in $list
do
    if (( $i == 0 )); then 
        ((i++))
    else
        IFS=$' '
        j=0
        for attrib in $row
        do
            ((j+=1))
            if (( $j == 1 )) || (( $j == 3 )) || (( $j == 5 )) || (( $j == 9 )); then 
                printf "%s " $attrib
            fi
        done
        printf "\n"
        IFS=$'\n'
        ((i++))
    fi
done
printf "%s%s\n" "Total number of files : " $((i-1)) 
IFS=$IFS_old
exit 0

答案1

嘗試解析 的輸出ls是不明智的,即使使用支援明確輸出選項的實作(例如GNU 版本中的-b或 )也是如此。-Q

相反,您應該使用 shell glob 一次處理一個檔案;在 Bash 中,我們可以使用陣列來實作:

#!/bin/bash

files=(*)

for i in "${files[@]}"
do
    stat --format '%A %U %n' -- "$i"
done

printf "Total number of files: %d\n" ${#files[@]}

相關內容