testingfilesizecheck.sh: line 6: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
나는 명령을 사용하고 있습니다for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*"
내가 매우 구체적이라면 "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin"
작동합니다.
저는 Linux(Ubuntu)와 bash를 처음 접했고 google-fu를 사용하여 이 문제를 진단하려고 합니다. 내가 찾을 수 있는 모든 예제 사이트에서는 와일드카드를 사용하여 수행하는 작업이 작동해야 한다고 제안하지만 터미널/bash 스크립트가 작동하는 것과 동일한 디렉터리에 예제를 유지합니다.
이 게시물을 게시하기 전에 나는 for 루프를 깔끔한 명령으로 사용하는 대신 폴더에 있는 파일 목록을 약간 "직접" 만들면서 매우 우회적으로 느껴지는 ls를 사용하여 해결 방법을 만들었습니다. 그래서 이 경우 와일드카드가 확장되지 않는 이유에 대한 학문적 답변을 찾고 있습니다.
편집: 큰따옴표 밖에 별표를 넣는 제안을 시도했습니다. 하지만 그것도 작동하지 않습니다. 지금 내 응답은 다음과 같습니다.
다음은 "bash testfilesizecheck.sh" 줄을 입력하고 Enter 키를 누른 후 터미널에서 복사하여 붙여넣은 것입니다.
doctor@doctor-X570-AORUS-ELITE:~/Documents$ bash testingfilesizecheck.sh
/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
testingfilesizecheck.sh: line 24: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*: No such file or directory
24행은 testinfilesizecheck.sh 스크립트에서 수행한 다른 모든 시도를 주석 처리한 것입니다. 다음은 주석 처리된 행을 뺀 스크립트입니다.
#!/bin/bash
for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*
do
echo "$f"
actualsize=$(wc -c < "$f")
done
echo $actualsize
마찬가지로 /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin에 파일이 있습니다.
그러나 와일드카드는 ABRA.bin을 허용하도록 확장되지 않습니다. 두 변형 모두 문자 그대로 별표일 뿐입니다. 제 생각에는 별표가 변수로 의미가 있으며 다른 프로그래밍 언어에 대한 초기 이해를 바탕으로 따옴표 붙은 문자열에 나타날 수 없습니다. 그러나 물론 그것은 나에게 효과가 없습니다.
답변1
큰따옴표는 와일드카드 문자 *
("globs")가 파일과 일치하도록 확장되는 것을 방지합니다. 대신 리터럴 별표 문자로 처리됩니다.
와일드카드가 인용되지 않은 경우에는 다음을 대신 사용하세요.
for f in '/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category'/*
여기서 중요한 부분은 공백이나 기타 특수 문자가 포함된 항목은 인용되지만 와일드카드는 인용되지 않는다는 것입니다. 다음 변형 중 하나를 사용할 수도 있습니다(가독성을 위해 경로가 단축됨).
'/media/…/Binary House/Final Structure Directory/Category'/*
'/media/…/Binary House/Final Structure Directory/Category/'*
/media/…/'Binary House/Final Structure Directory'/Category/*
/media/…/Binary' 'House/Final' 'Structure' 'Directory/Category/*
nullglob
( )를 설정하지 않으면 shopt -s nullglob
일치 항목이 없으면 for
리터럴 별표 문자가 포함된 경로를 사용하여 루프가 단일 반복됩니다. 이를 설정할 수 없는 경우 nullglob
"잘못된" 확장을 방지하기 위해 다음과 같은 것을 루프의 첫 번째 줄로 사용하십시오.
[ -e "$f" ] || continue
답변2
닫는 따옴표 뒤에 *를 추가합니다.
for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*; do echo f == "$f"; done