mv 명령 오류 "파일이 이미 존재합니다"

mv 명령 오류 "파일이 이미 존재합니다"

일부 디렉토리를 생성하기 위해 간단한 스크립트를 사용하고 있습니다. 이름으로 특정 파일을 찾아 내가 만든 디렉터리로 이동합니다. 내가 사용하는 코드는 다음과 같습니다.


mkdir ./3DBGB_run   
mkdir ./run_optimization   
mkdir ./run_optimization/project_mesh   
mkdir ./run_optimization/CFD_optimized    
find . -name '*.template' -exec mv -i {} ./3DBGB_run \;                 
find . -name '3dbgbinput.*.dat' -exec mv -i {} ./3DBGB_run \;           
find . -name 'controlinputs.*.dat' -exec mv -i {} ./3DBGB_run \;            
find . -name '*.iec' -exec mv -i {} ./run_optimization/project_mesh \;           
find . -name '*.trb' -exec mv -i {} ./run_optimization/project_mesh \;  
find . -name '*.py' -exec mv -i {} ./run_optimization \;**

코드가 실행되어 파일을 원하는 디렉터리로 이동하지만 각 파일에 대해 "동일한 파일이기 때문에 파일을 이동할 수 없습니다"라는 오류 메시지도 표시합니다.

답변1

대상 디렉터리에서 검색하는 것을 피해야 합니다. 예를 들어 다음과 같이 추가할 수 있습니다 ! -path $TARGET_DIR.

find . -name '*.template' ! -path "*3DBGB_run/*" -exec mv -it ./3DBGB_run {} \+

답변2

find파일은 두 번 발견됩니다(파일이 시작되는 위치와 이동하는 위치). 이는 결국 실행될 것임을 의미합니다.

mv -i 3DBGB_run/x.template 3DBGB_run/x.template

표시되는 오류가 발생합니다.

find파일이 "라이브"로 실행되는지 확인하세요. 미리 목록을 빌드한 다음 목록의 모든 항목에 대해 명령을 실행하지 않습니다. 파일과 디렉터리를 보는 순서는 정의되어 있지 않으므로(파일 시스템에서 올 수 있음) 디렉터리로 이동하기 전에 확인하는 모든 파일에서 이런 일이 발생합니다.

find자신이 무엇을 하고 있는지 모르기 때문에 만회할 방법이 없습니다 -exec. 이에 대해 수행할 수 있는 작업은 여러 가지가 있습니다.

  1. 검색 공간에서 디렉터리 제외: find . -name '*.template' -path "./3DBGB_run" -prune -o -exec mv -i {} ./3DBGB_run \;. -path섹션은 콘텐츠를 이동하려는 디렉터리와 일치하며,-prune그런 다음 재귀에서 전체 트리를 제외합니다. -o나머지 명령(원본 -exec)이 나머지 시간 동안 실행되도록 합니다. 이 명령은 디렉터리 내의 파일에서는 실행되지 않습니다. (이것은 매뉴얼의 명시적인 예입니다.암소 비슷한 일종의 영양find)
  2. 이사 전 체크리스트를 작성해보세요. 어떤 경우에는 이것이 더 나을 수도 있지만 파일 이름에 공백이나 기타 다른 내용이 있는 경우IFS캐릭터의 경우 효과가 그다지 좋지 않습니다. 이것이 적용되지 않으면 다음과 같습니다.

    files=$(find . -name '*.template')
    mv "${files[@]}" 3DBGB_run
    

    작동할 것입니다.


대신 명령을 종료 하면 find -exec최소한의 명령이 실행되어 각 실행에서 여러 인수를 수집하므로 더 효율적입니다. 때때로 이것은 특정 명령에 대해 작동하지 않지만 여기서는 작동합니다. 일회성 명령이라면 문제가 되지 않지만 자주 실행하는 경우 프로세스를 저장하면 시간이 절약됩니다.+;find

관련 정보