저는 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