일부 디렉토리를 생성하기 위해 간단한 스크립트를 사용하고 있습니다. 이름으로 특정 파일을 찾아 내가 만든 디렉터리로 이동합니다. 내가 사용하는 코드는 다음과 같습니다.
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
. 이에 대해 수행할 수 있는 작업은 여러 가지가 있습니다.
- 검색 공간에서 디렉터리 제외:
find . -name '*.template' -path "./3DBGB_run" -prune -o -exec mv -i {} ./3DBGB_run \;
.-path
섹션은 콘텐츠를 이동하려는 디렉터리와 일치하며,-prune
그런 다음 재귀에서 전체 트리를 제외합니다.-o
나머지 명령(원본-exec
)이 나머지 시간 동안 실행되도록 합니다. 이 명령은 디렉터리 내의 파일에서는 실행되지 않습니다. (이것은 매뉴얼의 명시적인 예입니다.암소 비슷한 일종의 영양find
) 이사 전 체크리스트를 작성해보세요. 어떤 경우에는 이것이 더 나을 수도 있지만 파일 이름에 공백이나 기타 다른 내용이 있는 경우
IFS
캐릭터의 경우 효과가 그다지 좋지 않습니다. 이것이 적용되지 않으면 다음과 같습니다.files=$(find . -name '*.template') mv "${files[@]}" 3DBGB_run
작동할 것입니다.
대신 명령을 종료 하면 find -exec
최소한의 명령이 실행되어 각 실행에서 여러 인수를 수집하므로 더 효율적입니다. 때때로 이것은 특정 명령에 대해 작동하지 않지만 여기서는 작동합니다. 일회성 명령이라면 문제가 되지 않지만 자주 실행하는 경우 프로세스를 저장하면 시간이 절약됩니다.+
;
find