mv: 'filename_1_2_3'을 계산할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

mv: 'filename_1_2_3'을 계산할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

내가 있는 상위 디렉토리 아래의 여러 디렉토리에서 많은 수의 파일을 이동하고 싶습니다.

백틱과 함께 다음 명령을 사용합니다.

mv -t directory1/directory2/directory3/ `ls -R | grep _2_3`

그래서 백틱으로 된 명령 소스를 현재 디렉터리(상위 디렉터리)에서 반복적으로 발견되는 대상 디렉터리 "directory3"으로 이동하고 싶습니다.

현재 명령을 사용하여 이를 수행할 수 있는 솔루션이 있습니까? 이 오류는 정확히 무엇을 의미하나요?

답변1

ls -R출력이 표시됩니다.파일 이름. 즉, 출력이 없습니다.경로명. 따라서 이름에 해당 문자열이 포함된 파일이 하위 디렉터리 중 하나에서 발견되면 _2_3해당 문자열에 대한 정보가 없습니다.어디ls -R파일은 출력(파일 이름과 같은 줄)에서 찾을 수 있습니다. 이로 인해 명령이 실패하게 됩니다(현재 디렉터리에서 파일 이름을 찾을 수 없음). 또한 이름에 공백, 탭 또는 줄 바꿈이 포함된 모든 파일에 대해 실패하며 파일 이름에 파일 이름 와일드카드 문자가 포함된 경우 이상한 결과가 발생할 수도 있습니다.

대신에 다음과 같은 이름의 파일을 이동하고 싶다고 가정해 보겠습니다._2_3디렉터리 로 변경한 /directory1/directory2/directory3다음(해당 디렉터리는 현재 디렉터리의 하위 디렉터리가 아님)

find . -type f -name '*_2_3' -exec mv -t /directory1/directory2/directory3 {} +

그렇게 할 것입니다. 이것은 _2_3이름이 현재 디렉토리 안이나 아래의 임의의 위치로 끝나는 모든 일반 파일(디렉토리, 명명된 파이프 또는 심볼릭 링크 등이 아닌)의 경로 이름을 찾고 mv -t /directory1/directory2/directory3이러한 경로 이름을 가능한 한 많이 일괄 처리합니다.

bash쉘 에서는 다음을 수행할 수도 있습니다.

shopt -s globstar
mv -t /directory1/directory2/directory3 -- **/*_2_3

패턴이 수천 개의 이름으로 확장되지 않는 한. 쉘 globstar옵션은 와일드카드 모드를 bash활성화합니다 **. 유사하게 작동 *하지만 일치합니다.지나가 다 /경로 이름에. 따라서 *_2_3현재 디렉터리 또는 그 아래의 어느 곳에서나 일치하는 모든 이름을 찾습니다 . 이 명령은 아무 것도 신경 쓰지 않습니다.유형예를 들어 이름이 일치하고 디렉터리 이름도 일치할 수 있습니다. 그러나 사용하는 ls -R방법도 일치합니다.

zsh셸 에서는 다음과 같이 더 정확하게 일치시킬 수 있습니다.

mv -t /directory1/directory2/directory3 -- **/*_2_3(.)

(.)일반 파일만 일치하도록 이전 패턴의 동작을 수정합니다 . 이 **모드는 에 있습니다 zsh.

이름이 같은 파일을 찾고 싶다면포함하다 _2_3, *_2_3위 명령에서 파일 이름 패턴의 비트를 *_2_3*.

답변2

메시지의 중요한 부분은 다음과 같습니다 No such file or directory.  ls -R파일 경로를 포함하지 마십시오. 그래서  mv파일명만 있는데 경로가 없어 찾을 수가 없습니다.

대신 이렇게 하세요:

$ find . -name '*_2_3*' -exec mv -t directory1/directory2/directory3/ {} +

작업 -exec … {} +findPOSIX 규격이지만 mv -t그렇지 않습니다.

관련 정보