スペースを含むファイル名が正しくリストされていません。

スペースを含むファイル名が正しくリストされていません。

以下のスクリプトには、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

明示的な出力オプション(GNUバージョンなど)をサポートする実装を使用しても、解析された出力を試すことはls賢明ではありません。-b-Q

代わりに、一度に1つのファイルを処理するにはシェルグローブを使用する必要があります。 Bashでは、配列を使用してこれを実行できます。

#!/bin/bash

files=(*)

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

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

関連情報