유사한 레이아웃을 가진 여러 디렉터리를 얻으려면 여러 디렉터리 위로 파일을 이동하세요.

유사한 레이아웃을 가진 여러 디렉터리를 얻으려면 여러 디렉터리 위로 파일을 이동하세요.

다음과 같은 레이아웃을 가진 디렉터리가 있습니다(그 안의 레이아웃은 Directory 1다른 디렉터리에서도 반복됩니다).Directory <num>

상위 디렉토리
   디렉토리 1
      일부 디렉토리
         다른 디렉토리
            <많은 파일>
   디렉토리 2
   목차 3
   목차 4

다음과 같이 접두사를 붙여 파일 이름을 바꾸고, 아래에 있도록 3개 디렉터리 위로 이동한 다음, 원래(현재 비어 있는) 디렉터리를 삭제하고 싶습니다.Directory <num>Parent directory

상위 디렉토리
   카탈로그 1_<많은 파일>
   디렉토리 2
   목차 3
   목차 4

어떻게 해야 하나요?

다음 내용은 다음에서 가져온 것입니다.유제

find . -mindepth 2 -name '*.jpg' -exec rename -n 's!/([^/]+)$!_$1!' {} +

파일 이름을 첫 번째 상위 디렉터리로 바꿉니다.

상위 디렉토리
   디렉토리 1
      다른 디렉토리_<많은 파일>
   디렉토리 2

답변1

첫째, 귀하가 보여주신 명령의 주장된 결과를 재현할 수 없습니다. 파일 이름을 등으로 바꿨 another directory_file1.jpg습니다 another directory_file2.jpg. 하지만 아직 some directory 목차.

둘째, 디렉토리 구조의 깊이 때문에 -mindepth 4대신 를 사용해야 합니다 2. 셋째, 을 -type f사용하는 동안에는 -name '*.jpg'디렉토리를 찾을 수 없을 것입니다. 하지만 6~8주 후에는 이것을 보고 "이것을 내 모든 파일에 적용하고 싶습니다. 그렇게 말할 필요는 없습니다 -name '*.jpg'"라고 생각한 다음 꺼내게 됩니다. 그런 다음 디렉토리가 없으면 -type f명령 find이 디렉토리를 찾아 이름을 바꾸기 시작할 수 있습니다. 검색되는 동안 디렉토리 트리를 수정하는 것은 재앙을 불러일으키는 방법입니다(속담인 "비행기를 만드는 동안 비행기를 조종하는 것"과 같습니다).

넷째, 파일을 세 단계 위로 이동하고 이름 앞에 접두사를 붙이는 이름 바꾸기 명령은 다음과 같습니다.Directory <num>_

이름 바꾸기 -n 's!/[^/]+/[^/]+/([^/]+)$!_$1!'
        (선택 과목)

/[^/]+디렉터리 수준을 나타내기 때문에 복사본을 두 개만 추가했습니다.

경고: 앞서 말했듯이 이렇게 하면 파일이 세 단계 위로 이동합니다. 디렉토리 트리에 이 깊이보다 깊은 파일이 있는 경우 최상위 수준으로 이름이 바뀌지 않으며 비슷한 이름으로 바뀔 수 있습니다 Directory 3/some directory_file3.jpg.

그러나 이것은 쉬운 해결책임이 밝혀졌습니다. 파일을 최상위 수준으로 이동그 깊이가 아무리 깊어도, 이름 앞에 접두사를 추가하고 다음을 사용하세요.Directory <num>_

s!(\./[^/]+)/.*/([^/]+)$/$1_$2/!

긴 이야기 짧게

그래서,

마지막 순서는

find . -mindepth 4 -type f -exec rename -n 's!/[^/]+/[^/]+/([^/]+)$!_$1!' {} +

-name '*.jpg'필요한 경우 추가할 수 있습니다. -n추적 출력에 올바른 작업이 수행되고 있음이 표시되면 제거하세요.

이로 인해 파일 이름 충돌이 발생할 수 있습니다. 파일이 있다면

Directory 1/some directory/another directory/sunrise.jpg

그리고

Directory 1/some directory/another directory/mountains/sunrise.jpg

명령은 이들의 이름을 모두 바꾸려고 시도합니다 Directory 1_sunrise.jpg. 다행스럽게도 이 rename프로그램은 이 경우 아무런 해를 끼치지 않을 만큼 똑똑하고 친숙해 보입니다. 처음 보는 파일의 이름이 변경될 수 있으며, 다른 파일은 그대로 유지됩니다(알림을 받게 됩니다). ( -f또는 을 사용하여 --force기존 파일을 강제로 덮어쓸 수 있습니다.) 그러나  mv.


최신 질문("파일 이름에 모든 디렉터리 이름을 포함하는 방법은 무엇입니까?"): 이는 약간 까다롭습니다. 우리가 검색 중이라고 명시적으로 가정하겠습니다.../이므로 모든 경로 이름은 . 내가 찾은펠렉스푸의 매개변수에는 rename 실제로 여러 문자열 수정 명령이 포함될 수 있습니다. 따라서 모든 파일을 최상위 수준으로 이동하고 해당 이름 앞에 경로에 있는 모든 디렉터리의 이름을 붙일 수 있습니다.

s!^\./!!;s!/!_!g

파일 이름이 충돌할 가능성도 있습니다.

Directory 1/abc/def_ghi/sunrise.jpg

그리고

Directory 1/abc_def/ghi/sunrise.jpg

둘 다 (아마도) 이름을 Directory 1_abc_def_ghi_sunrise.jpg.


부인 성명:나는 이것을 테스트했지만 철저하게 테스트하지는 않았습니다. 나는 이것이 완벽하게 작동할 것이라고 보장하지 않습니다. 위 명령을 시도하기 전에 전체 백업을 만들어야 합니다.

관련 정보