다음과 같은 레이아웃을 가진 디렉터리가 있습니다(그 안의 레이아웃은 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
.
부인 성명:나는 이것을 테스트했지만 철저하게 테스트하지는 않았습니다. 나는 이것이 완벽하게 작동할 것이라고 보장하지 않습니다. 위 명령을 시도하기 전에 전체 백업을 만들어야 합니다.