모든 파일을 한 폴더 위로 이동하는 재귀 스크립트 작성 [닫기]

모든 파일을 한 폴더 위로 이동하는 재귀 스크립트 작성 [닫기]

이 질문을 많이 받은 것으로 알고 있습니다. 아직도 그들 중 일부는 답을 얻지 못한 채 남아 있고 다른 일부는 내 질문에 대답하지 않습니다.

다음 디렉터리 계층 구조를 고려하세요.

예를 들어 디렉터리에는 f1여러 디렉터리가 포함되어 있습니다. 모든 디렉터리와 해당 하위 디렉터리의 모든 파일을 제외하고 해당 상위 디렉터리로 이동하는 스크립트를 작성하고 싶습니다.f1

이제 예를 살펴보겠습니다.

f1 디렉토리에는 file1, file2, file3,..., filen 파일이 포함되어 있고 하위 디렉토리 sd1, sd2, sd3,..., sdn에는 하위 디렉토리가 포함되어 있습니다!

각 하위 디렉터리에는 상위 디렉터리와 이름이 같은 파일, 즉 file1, file2...가 포함됩니다. 그러나 모든 파일의 내용은 다릅니다. 작업이 완료되면 이러한 하위 디렉터리의 모든 파일을 상위 디렉터리로 이동해야 합니다. 모든 파일이 서로 다른 "경로 이름"으로 끝나기 때문에 이름 충돌이 문제가 될 것이라고 생각하지 않습니다. 이름 충돌만 발생할 수 있는 경우 파일을 루트의 상위 디렉터리로 이동할 수 없기 때문에 루트 디렉터리에 있을 것입니다. 거기에서 root원래 존재했던 파일에 단어가 추가되어야 합니다.

몇 가지 예시 경로:

f1/sd1/sd1/file1
f1/sd1/file1
f1/file1

수술 후,

f1/sd1/sd1/file1 -> f1/sd1/file
f1/sd1/file1     -> f1/file1
f1/file1         ->f1/file1_root

이 문제를 해결할 방법이 있나요?

답변1

find및 다음을 사용하여 각 파일을 위로 이동할 수 있습니다 -execdir.

find f1 -mindepth 2 -type f -execdir mv -t ../ {} +

중복된 파일 이름을 덮어쓰게 되므로 mv -b기존 파일을 백업하는 데 사용하는 것을 고려해 보십시오.

  • -mindepth 2가장 낮은 수준의 폴더( f1)는 제외됩니다.
  • -execdir ... +발견된 파일이 있는 폴더에서 명령이 실행됩니다.

관련 정보