파일은 존재하지만 mv 오류: "mv: 'file.tar.gz'를 stat할 수 없습니다: 해당 파일이나 디렉터리가 없습니다."

파일은 존재하지만 mv 오류: "mv: 'file.tar.gz'를 stat할 수 없습니다: 해당 파일이나 디렉터리가 없습니다."

Centos 7에서 한 디렉터리의 최신 파일을 다른 디렉터리로 이동하는 스크립트를 만들고 있습니다. 복사한 원래 디렉터리에는 유효한 파일이 포함되어 있지만 파일을 이동하거나 복사하려고 하면 파일이 존재하지 않는다는 오류 메시지가 나타납니다. 아래에서 보여주듯이 파일이 존재한다는 것을 알고 있습니다. 왜 실패하며 이를 해결하려면 어떻게 해야 합니까?

셸의 스크립트에서 이 줄을 실행하면 $(예상대로 출력이 변수로 확장됩니다.

NEW=$(ls -Art /home/user/directory/ | tail -1)

다음과 같이 변수 값을 에코하여 이를 스스로 증명할 수 있습니다.
echo $NEW

file.tar.gz

그런 다음 파일을 다른 디렉터리로 이동해 보았습니다.

mv $NEW /usr/local/directory/

..여기서 오류가 발생합니다. 오류 메시지에서는 찾을 수 없는 파일의 이름을 명시적으로 지정합니다.

mv: 'file.tar.gz'를 계산할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

쉘은 파일을 찾을 수 없다고 알려주고 찾을 수 없는 파일의 이름을 지정합니다.

백틱을 괄호로 바꾸려고 시도했지만 동일한 결과를 얻었습니다. 나는 파일과 그 위의 디렉터리에 대한 권한을 내가 생각할 수 있는 거의 모든 순열로 변경하고 소유권을 user.user로 변경해 보았습니다.

루트와 사용자로 명령을 실행해 보았지만 매번 동일한 결과를 얻었습니다. 이 문제를 해결하는 데 도움을 주시면 감사하겠습니다.

답변1

파일이 있는 디렉터리에 없는 것 같습니다.

너는 사용한다

 ls -Art /home/user/directory/    

디렉터리 부분이 아닌 파일 이름 부분만 반환합니다.

이동 명령은 다음과 같아야 합니다.

mv "/home/user/directory/$NEW"  /usr/local/directory/

답변2

또는 ;

NEW="/home/user/directory/"`ls -Art /home/user/directory/ | tail -1`

그러면 명령 mv이 평소대로 진행됩니다.

mv "$NEW" /usr/local/directory/

답변3

단독으로 시도해 보면 ls -Art /home/user/directory디렉터리 경로 부분 없이 파일 이름만 출력된다는 것을 알 수 있습니다. 이는 변수에 파일 경로 이름 시작 부분의 비트가 NEW누락되었음을 의미합니다./home/user/directory

이것을 추가하면 NEW"좋은" 파일 이름(줄 바꿈이나 다른 공백, 파일 이름 와일드카드 문자 없음)을 가정하고 기꺼이 수락한다고 가정하여 명령이 작동하게 됩니다.어느tail디렉토리 이름이더라도 출력의 파일 이름 입니다.

최근 수정된 일반 파일을 한 디렉토리에서 다른 디렉토리로 이동하는 문제를 해결하는 더 좋은 방법은 쉘을 사용하는 것입니다 zsh.

mv /home/user/directory/*(.Dom[1]) /usr/local/directory

(.Dom[1])이전 패턴이 일반 파일( .)만 일치하도록 하고, 숨겨진 이름을 일치시킬 수 있게 하고( D, dotglob의 셸 옵션 처럼 작동함 bash), 수정 타임스탬프( )를 기준으로 결과 목록을 정렬하고 , om첫 번째 요소를 선택하는 와일드카드 한정자입니다. 정렬된 목록( [1]).

bash또는 다른 쉘 에서 :

zsh -c 'mv /home/user/directory/*(.Dom[1]) /usr/local/directory'

관련 정보