" 및 *가 있는 파일을 이동하면 오류가 발생합니다.

" 및 *가 있는 파일을 이동하면 오류가 발생합니다.

Bash 스크립트에서 파일을 이동하는 데 문제가 있습니다. 동일한 문제에 대해 여기에서 다른 솔루션을 시도했지만 작동하는 것을 찾을 수 없습니다.

마지막 시도는 추가하는 것이었지만 shopt -s dotglob nullglob아무것도 해결되지 않았습니다.

이번 테스트에서는

jdir0="/media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)"


mv -v "$jdir0/*" "$jdir0/subs/" &>> $debuglog

..나는 얻다:

mv: cannot stat '/media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/*': No such file or directory

하지만 네, 있어요!

drwxrwx--- 1 root vboxsf   4096 Aug 22 07:06  ../
-rwxrwx--- 1 root vboxsf      0 Aug 21 17:19 'kallee.(222)..nnn.srt'*
-rwxrwx--- 1 root vboxsf 159363 Aug 21 17:26 'movie.test(2929).ismim.mp4'*
drwxrwx--- 1 root vboxsf      0 Aug 22 07:06  subs/

(이 이름들이 정말 이상한 이유는 이 기능 이전에 유효하지 않은 문자 제거를 테스트하고 있기 때문입니다.)

업데이트: 분명히 간헐적인 오류가 발생했는데, 며칠 후 마침내 서버 문제(파일이 저장된 위치)를 추적했습니다. 분명히 이러한 오류는 서버가 저장/이름 변경을 완료하지 않았고 스크립트가 서버에 새 작업을 수행하도록 요청하는 경우 발생합니다. 예를 들어, 파일 A의 이름을 B로 바꾼 다음 첫 번째 요청을 수행하기 전에 서버에 B의 이름을 C로 바꾸도록 요청하면 서버는 B가 존재하지 않는다는 메시지를 표시하게 되며 결과적으로 오류 코드가 발생합니다.

답변1

*쉘의 전역 연산자입니다. 인식하려면 인용을 해제해야 합니다. 참조될 때 은(는) /media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/*문자 그대로 전달되어 mv이름 mv이 인 파일을 이동하려고 시도 *하지만 해당 파일이 없습니다.

따라서 다음이 필요합니다.

mv -v -- "$jdir0"/* "$jdir0/subs/" >> "$debuglog" 2>&1

를 호출하기 전에 쉘이 "$jdir0"/*일치하는 파일 목록으로 확장 되도록 합니다 mv.

당신은 그렇습니다아니요여기서는 패턴과 일치하는 파일이 없으면 호출만 사용되어 혼란 스러운 구문 오류가 발생한다는 nullglob의미이므로 여기에서 필요했습니다 ."$jdir0"/*mv-v--media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/subs/mv

failglob이 경우 전역이 일치하지 않을 때 명령을 중단하는 것이 더 나은 옵션일 수 있지만 bash이 경우 명령이 호출되는 컨텍스트에 따라 중단이 일관되지 않은 방식으로 수행되므로 이 옵션이 스크립트에서 유용합니다. 일어나는 것이 까다 롭습니다.

dotglobglob이 숨겨진 파일과 일치하도록 허용합니다.

이제 glob은 파일 유형에 관계없이 파일을 일치하므로 *위의 내용도 일치합니다 subs. subs디렉토리에 대한 심볼릭 링크인 경우 mv심볼릭 subs링크를 해당 디렉토리로 이동하여 모든 후속 이동이 실패하게 됩니다 subs. 이제 사라졌습니다. subs일반 하위 디렉터리인 경우 디렉터리 mv를 자체적으로 이동할 수 없다고 불평할 수 있습니다.

따라서 다음과 같이 작성하고 싶을 수도 있습니다.

shopt -s extglob
mv -v -- "$jdir0"/!(subs) "$jdir0/subs/" >> "$debuglog" 2>&1

!(pattern)모든 파일 이름과 일치하는 ksh 확장 glob 연산자는 어디에 있습니까?아니요일치 pattern하므로 여기서는 을 제외하고 이동합니다 subs.

또한 bash셸에서는 비대화형 셸 인스턴스에서도 리디렉션 대상에 인용된 인수 확장이 필요합니다(bash가 POSIX 모드에 있는 경우 제외).


¹ bash 및 해당 glob 한정자 대신 zsh를 사용하지 않는 한, 예를 들어 *(.)move only정기적인문서

관련 정보