現在のディレクトリ項目リストの特殊配列

現在のディレクトリ項目リストの特殊配列

現在のディレクトリリストから特別にフォーマットされた配列を抽出したいと思います。

$ 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)を追加します。)helloworld

#!/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)はそれ自体の配列に格納せずにアイテムのインデックスから直接派生できます。

おすすめ記事