내 Mac에는 현재 위치의 하위 폴더에 있는 txt 파일을 반복하려고 하는 스크립트가 있습니다. 이것은 myscript.sh
:
cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt
do
echo $entry
done
*txt
/Users/Desktop/txt/*.txt
이는 .txt 파일을 반복하려는 것처럼 그 안에 포함된 경로 문자열을 인쇄하므로 echo $entry
txt 파일의 이름을 인쇄할 것으로 예상했지만 대신 인쇄됩니다./Users/Desktop/txt/*.txt
답변1
파일 이름과 일치하지 않는 globbing 패턴을 셸에 제공하면 globbing 패턴이 확장되지 않습니다. 귀하의 경우 이는 echo
출력 패턴 자체를 반복하는 것을 의미합니다.
스크립트의 대체 구현:
cd /Users/Desktop || exit 1
for entry in txt/*.txt; do
test -e "$entry" && echo "$entry"
done
실패하면 이 구현은 0이 아닌 종료 코드로 종료됩니다 cd
. 그러면 그럴 것이다아니요pwd
필요가 없기 때문에 사용됩니다 . 패턴과 일치하는 이름 목록을 얻고 이름을 반복합니다. 각 반복에서 해당 이름을 표준 출력으로 인쇄하기 전에 해당 이름을 가진 항목이 파일 시스템에 실제로 존재하는지 확인하기 위해 테스트합니다.
echo
lop 내부의 출력 파일에 대한 전체 경로를 원할 경우 lop 을 사용 echo "/Users/Desktop/$entry"
하거나 더 나은 방법을 사용하십시오.
dir="/Users/Desktop"
cd "$dir" || exit 1
for entry in txt/*.txt; do
test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done