사용자가 색인 번호를 입력하여 파일을 선택할 수 있도록 색인과 함께 디렉토리의 모든 파일을 나열하는 방법은 무엇입니까?

사용자가 색인 번호를 입력하여 파일을 선택할 수 있도록 색인과 함께 디렉토리의 모든 파일을 나열하는 방법은 무엇입니까?

디렉토리에 여러 파일이 있고 사용자가 전체 파일을 작성하는 대신 색인을 기반으로 선택할 파일을 선택할 수 있도록 옆에 색인과 함께 모든 파일을 나열하는 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

*를 반복하고 배열의 파일을 기억합니다.

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

답변2

bash 지시문의 유용성에 대한 @Cyrus의 의견 확장 select....

숫자나 이름으로 선택할 수 있다는 규정이 없었다면 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가방에 가지고 다닐 수 있는 유용한 도구입니다.

manBash 페이지에는 우리가 활용할 수 있는 의 동작의 몇 가지 측면이 나와 있습니다 select.

그런 다음 PS3 프롬프트가 표시되고
표준 입력에서 한 줄을 읽습니다. 행이 표시된 단어 중 하나에 해당하는 숫자로 구성되면
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'

관련 정보