現在のディレクトリリストから特別にフォーマットされた配列を抽出したいと思います。
$ ls
Output:
fileABC.ext1
filePQR.ext2
dirMNO
dirFGH
特定の拡張子を持つディレクトリとファイルのみが必要です
私はこのような配列が欲しい
(1 dirFGH "is a dir" 2 dirMNO "is a dir" 3 fileABC.ext1 "is an ext1 file")
私も同じことをしています。
num=0
while read -r line
do
if [ -d $line ]
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is a dir")
elif #check for extension used
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is an ext1 file")
fi
done < <(ls -1 --group-directories-first "$path")
しかし、この方法は遅くなります。機能的に同じですが、最適化された方法を提案してください。
ベストアンサー1
解析する必要はありませんls
。変数を使用するたびに二重引用符を使用する必要があります。それ以外の場合は、分割(通常はスペース)とワイルドカード"$line"
の影響を受けます。$IFS
(たとえば、$line
そのhello world
場合は2つの値とarray+=($line)
を追加します。)hello
world
#!/bin/bash
array=()
for item in *
do
if [[ -d "$item" ]]
then
# Directory
array+=( $((${#array[@]} /3 +1)) "$item" 'is a dir' )
elif [[ -f "$item" ]] && [[ "$item" = *.ext1 ]]
then
# Files with an ext1 suffix
array+=( $((${#array[@]} /3 +1)) "$item" 'is an ext1 file' )
fi
done
# Dump the array
printf "%2d. '%s' %s\n" "${array[@]}"
出力
1. 'dirFGH' is a dir
2. 'dirMNO' is a dir
3. 'fileABC.ext1' is an ext1 file
この式は、$((${#array[@]} /3 +1))
すでに配列にあるトリプル値の数に基づいて項目数を計算するため、キャリーは必要ありません$num
。
可能な改善
特定の種類のファイルを探している場合は、を使用して確認できますfile
。たとえば、file x.ods
マイコンピュータに戻りますx.ods: OpenDocument Spreadsheet
。
2つの異なる配列(ファイル名用の配列とカスタムファイル形式のメッセージ用の配列)を使用する方が簡単かもしれません。
filenames+=("$item")
filetypes+=('Is a dir')
ここで、インデックス値($num
)はそれ自体の配列に格納せずにアイテムのインデックスから直接派生できます。