숫자가 앞에 붙은 현재 디렉터리의 파일 나열

숫자가 앞에 붙은 현재 디렉터리의 파일 나열

저는 bash를 배우려고 하며 다음과 같이 a.sh에서 bash 스크립트를 사용하여 폴더의 파일을 나열하려고 합니다.

1: a.sh
2: b.sh
3: c.sh

ls 및 find 명령을 살펴봤지만 원하는 대로 숫자가 접두어로 붙지 않는 것 같습니다. 도와주세요!

답변1

이를 수행하는 방법에는 여러 가지가 있습니다. 예를 들어, 파일 이름에 개행 문자가 포함되어 있지 않다고 확신하는 경우 다음을 수행할 수 있습니다.

$ ls | cat -n
     1  a.sh
     2  b.sh
     3  c.sh
     4  d.sh

줄 바꿈이나 기타 이상한 문자가 포함된 파일 이름을 처리하는 더 안전한 방법:

$ c=0; for file in *; do ((c++)); printf '%s : %s\n' "$c" "$file"; done
1 : a.sh
2 : b.sh
3 : c.sh
4 : d.sh

후자의 두 가지가 더 나은 이유를 확인하려면 개행 문자가 포함된 파일 이름을 만드십시오.

$ touch 'a long file name'
$ touch 'another long filename, this one has'$'\n''a newline character!'

이제 두 메서드의 출력을 비교해 보세요.

$ ls | cat -n
     1  a long file name
     2  another long filename, this one has
     3  a newline character!
     4  a.sh
     5  b.sh
     6  c.sh
     7  d.sh

위에서 볼 수 있듯이 구문 분석 ls(일반적으로 나쁜 생각)으로 인해 줄 바꿈이 있는 파일 이름이 두 개의 별도 파일로 처리됩니다. 올바른 출력은 다음과 같습니다.

$ c=0; for file in *; do ((c++)); printf '%s : %s\n' "$c" "$file"; done
1 : a long file name
2 : another long filename, this one has
a newline character!
3 : a.sh
4 : b.sh
5 : c.sh
6 : d.sh

@Vikyboss가 주석에서 지적했듯이 위의 셸 솔루션은 $c루프가 종료된 후에도 지속되는 변수를 설정합니다. 이를 방지하려면 unset c끝에 추가하거나 다른 방법을 사용할 수 있습니다. 예를 들어:

$ perl -le 'for(0..$#ARGV){print $_+1 ." : $ARGV[$_]"}' *
1 : a long file name
2 : another long filename, this one has
a newline character!
3 : a.sh
4 : b.sh
5 : c.sh
6 : d.sh

답변2

괜찮나요?

ls | awk '{print NR": "$0}'
1: andy
2: a.out
3: exclude

관련 정보