
以下のスクリプトのコードでは、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
代わりに、シェル glob を使用してファイルを 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[@]}