for 루프는 * 구문을 구별할 수 없습니다.

for 루프는 * 구문을 구별할 수 없습니다.
set -x 
for f in ~/1/2/*/*_1.txt; do
subdir="${f%/*}"
pushd "$subdir" &>/dev/null
file="${f##*/}"

expTool INPUT1= "${f##*/}" INPUT2= "${f%_1.txt}_2.txt OUTPUT1= "${f%_1.txt}_3.txt" OUTPUT2= "${f%_2.txt}_4.txt"
done

expTool error: [Errno 2] No such file or directory: '*_1.txt'

인용을 뺐지만 작동하지 않습니다.

편집: set -x 사용

+for f in '/User/admin/1/2/*/*_1.txt'
+subdir='/User/admin/1/2/*'
+pushd '/User/admin/1/2/*'
+file='*_1.txt'
+expTool INPUT= '*_1.txt' OUTPUT= '${f%_1.txt}_2.txt'

그러면 "*" 구문이 와일드카드(?)로 등록되지 않은 것으로 보입니다. 저는 Mac OSX 10.8.6을 사용하고 있습니다.

답변1

와일드카드 확장을 비활성화하는 스크립트의 앞부분을 실행 중이 거나 set -f일치하는 파일이 없습니다. 일치하는 파일이 없으면 패턴은 변경되지 않은 채 유지되므로 for 루프는 패턴이 변경되지 않은 요소에서 작동합니다. Bash에서는 shopt -s nullglob빈 목록으로 확장하는 대신 를 사용하여 일치하지 않는 패턴을 만들 수 있습니다.

답변2

코드를 이해했는지 잘 모르겠습니다.

for f in ~/1/2/*/*_1.txt; do
  fdn="${f%/*}"
  fbn1="${f##*/}"
  fbn2="${fbn1//_1/_2}"
  fbn3="${fbn1//_1/_3}"
  fbn4="${fbn1//_1/_4}"
  expTool INPUT1= "$fdn/$fbn1" INPUT2= "$fdn/$fbn2" OUTPUT1= "$fdn/$fbn3" OUTPUT2= "$fdn/$fbn4"
done

제가 주제인 경우 알려주시면 답변을 삭제하겠습니다!

관련 정보