나는 두 개의 짧은 bash 스크립트를 사용하여 모든 디렉토리의 모든 *.dds 파일 이름을 바꿉니다.
첫 번째:
#!/bin/bash
j=39;
for i in *.dds;
do let j+=1;
mv $i 0150$j.dds;
done
두번째:
CURDIR=`pwd`
for d in $(find . -type d);
do
cd $CURDIR/"$d"
$CURDIR/3_rename.sh
done
두 번째 것을 실행하고 다음을 얻습니다.
mv: cannot stat '*.dds': No such file or directory
그러나 *.dds 파일의 이름은 올바르게 변경되었습니다. 이 오류를 일으킨 내 오류를 이해하고 싶습니다.
답변1
이름 바꾸기 스크립트에서 *.dds
glob은 .dds 확장자로 끝나는 현재 디렉터리의 파일 이름(1.dds, 2.dds 등)으로 확장됩니다.
여기서 문제는 디렉터리에 .dds 확장자로 끝나는 파일이 없으므로 glob에 일치하는 항목이 없다는 것입니다. 이 경우 기본 동작은 bash
리터럴 문자열 "*.dds"를 반환하는 것입니다. 이는 mv
해당 파일이 없기 때문에 오류를 인쇄하는 명령 에 전달됩니다 .
쉘 옵션 "nullglob"은 이 동작을 조정할 수 있습니다. "nullglob"이 활성화되면 리터럴 문자열을 반환하는 대신 일치하지 않는 glob이 사라집니다. 인수가 0이면 for
루프는 빈 디렉터리를 건너뜁니다.
반복하기 전에 "nullglob"을 켤 수 있습니다.
shopt -s nullglob
for i in *.dds;
...
자세한 내용과 예시는 여기에서 확인할 수 있습니다.https://mywiki.wooledge.org/glob#nullglob. "nullglob"을 사용할 때 몇 가지 문제를 강조하므로 경고 및 이식성 하위 섹션에 주의하세요.