it-swarm-ja.com

ユーザーがインデックス番号を入力してファイルを選択できるように、ディレクトリのすべてのファイルをインデックスとともに一覧表示するにはどうすればよいですか?

ディレクトリに複数のファイルがあり、bashスクリプトを使用して、すべてのファイルとその横のインデックスを一覧表示し、ユーザーがファイル全体を書き込む代わりに、インデックスに基づいて選択するファイルを選択できるようにしています。名前。

例えば。

main_dir
 - temp_1
 - temp_2

私の試み:

while [[ 1 ]]; do
        printf "Which file do you want to use? ($(ls -m ${main_dir})) "
        read -r ans
        if [[ -d ${main_dir}/${ans} ]]; then
            break
        else
            echo "[ERROR] Failed to choose. Please choose from ($(ls -m "${main_dir}"))."
        fi
    done

この場合、出力は次のとおりです。

Which file do you want to use? (temp_1, temp_2)

また、ユーザーはファイルの名前を入力して選択する必要があります。

期待される結果:

Which file do you want to use? 
1. temp_1 
2. temp_2

また、ユーザーは名前またはインデックスを入力するという両方の方法でファイルを選択できる必要があります。

1
loadbox

*をループし、配列内のファイルを覚えておいてください。

files=()
i=0
for f in *
do 
  [ -d "$f" ] && continue ## skip directoriries
  files[$i]="$f"
  echo "$i"$'\t'"${files[i]}"
  (( ++i ))
done
if read -p "Which file do you want to use? " ans 
then 
     echo "you choose ${files[ans]}"
     stat "${files[ans]}"
     wc "${files[ans]}"
fi
1
Jasen

Bashのselectディレクティブのユーティリティに関する@Cyrusのコメントを拡張しています..。

番号や名前で選択できるという規定がなかった場合は、bashのselectだけで十分かもしれません。

$ select name in *; do printf "You chose %s\n" "$name"; done
1) file AA    6) file_E   11) file_J   16) file_O   21) file_T   26) file_Y
2) file_A     7) file_F   12) file_K   17) file_P   22) file_U   27) file_Z
3) file_B     8) file_G   13) file_L   18) file_Q   23) file_V   28) foo.sh
4) file_C     9) file_H   14) file_M   19) file_R   24) file_W
5) file_D    10) file_I   15) file_N   20) file_S   25) file_X
#? 1
You chose file AA
#? 4
You chose file_C
#? 28
You chose foo.sh
#? ^D

インターフェースはいくつかのニーズのために少し質素かもしれませんが、速くて汚いものが必要なとき、それでもシェルグレードの信頼性があるとき、selectはあなたのバッグに入れるのに便利なツールです。

Bashのmanページは、利用できるselectの動作のいくつかの側面を引用しています。

PS3プロンプトが表示され、から行が読み取られます。
標準入力。行が対応する番号で構成されている場合
表示された単語の1つに、nameの値がに設定されます
その言葉。行が空の場合、単語とプロンプトは
が再び表示されます。 EOFが読み取られると、コマンドは完了します。任意
他の値を読み取ると、名前がnullに設定されます。読んだ行
は変数REPLYに保存されます。

したがって、selectの呼び出しの周りにサポートコードを配置することで、これが可能になります。

unset name

_PS3="$PS3"
PS3="Which file do you want to use? "

while [ -z "$name" ]
do

    select name in *; do break; done

    if [ -z "$name" ]
    then
        if [ -f "$REPLY" ]
        then
            name="$REPLY"
            printf "You chose by name: '%s'\n" "$name"
        else
            printf "There is no file by that name.\n"
        fi
    else
        printf "You chose by number: '%s'\n" "$name"
    fi

done

PS3="$_PS3"; unset _PS3

出力:

$ ./foo.sh 
1) file AA    6) file_E   11) file_J   16) file_O   21) file_T   26) file_Y
2) file_A     7) file_F   12) file_K   17) file_P   22) file_U   27) file_Z
3) file_B     8) file_G   13) file_L   18) file_Q   23) file_V   28) foo.sh
4) file_C     9) file_H   14) file_M   19) file_R   24) file_W
5) file_D    10) file_I   15) file_N   20) file_S   25) file_X
Which file do you want to use? 12
You chose by number: 'file_K'
$ ./foo.sh 
1) file AA    6) file_E   11) file_J   16) file_O   21) file_T   26) file_Y
2) file_A     7) file_F   12) file_K   17) file_P   22) file_U   27) file_Z
3) file_B     8) file_G   13) file_L   18) file_Q   23) file_V   28) foo.sh
4) file_C     9) file_H   14) file_M   19) file_R   24) file_W
5) file_D    10) file_I   15) file_N   20) file_S   25) file_X
Which file do you want to use? file W
There is no file by that name.
1) file AA    6) file_E   11) file_J   16) file_O   21) file_T   26) file_Y
2) file_A     7) file_F   12) file_K   17) file_P   22) file_U   27) file_Z
3) file_B     8) file_G   13) file_L   18) file_Q   23) file_V   28) foo.sh
4) file_C     9) file_H   14) file_M   19) file_R   24) file_W
5) file_D    10) file_I   15) file_N   20) file_S   25) file_X
Which file do you want to use? 29
There is no file by that name.
1) file AA    6) file_E   11) file_J   16) file_O   21) file_T   26) file_Y
2) file_A     7) file_F   12) file_K   17) file_P   22) file_U   27) file_Z
3) file_B     8) file_G   13) file_L   18) file_Q   23) file_V   28) foo.sh
4) file_C     9) file_H   14) file_M   19) file_R   24) file_W
5) file_D    10) file_I   15) file_N   20) file_S   25) file_X
Which file do you want to use? file AA
You chose by name: 'file AA'
1
Jim L.