폴더 이름의 일부를 새 문자열로 바꿉니다.

폴더 이름의 일부를 새 문자열로 바꿉니다.

이 주제를 다루는 다양한 답변을 찾았습니다.이것, 하지만 내 목적으로는 작동하지 않습니다. "-" 문자 때문이거나 설정 방법 때문일까요?

저는 터미널과 함께 Linux Mint(Debian)를 사용하고 있습니다.

다음과 같은 많은 폴더와 하위 폴더가 있습니다.

folder1-Misc
folder2/afolder2name-Misc
folder2/afolder2name-SomethingElse
folder3/afolder3name-Misc
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Misc
folder4/afolder4name-Misc/insideafolder4name-Misc
folder5/afolder5name-Misc
folder4/afolder5name-Misc/insideafolder5name-Misc

루트 폴더에서 시작하여 위의 내용이 -Misc포함된 모든 폴더 이름을 바꾸고 싶습니다.-Docs

folder1-Docs
folder2/afolder2name-Docs
folder2/afolder2name-SomethingElse
folder3/afolder3name-Docs
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Docs
folder4/afolder4name-Docs/insideafolder4name-Docs
folder5/afolder5name-Docs
folder4/afolder5name-Docs/insideafolder5name-Docs

폴더 내용(파일)이나 구조가 손상될 위험을 감수하고 싶지 않습니다.

위의 답변 링크는 작동해야 하는데 작동하지 않습니다... 이렇게 되어야 한다고 생각했는데 작동하지 않습니다.

find . -type f -exec rename 's/*-Misc/-Docs/g' {} +

어떤 도움이라도 대단히 감사하겠습니다. 이것이 실제로 간단한 해결책이기를 바랍니다 :)

답변1

다른 버전을 사용하고 계신 것 같습니다 rename. Perl 버전은 당신이 찾고 있는 버전이며 일반적으로 해당 명령은 file-rename. 내 경우에는 패키지를 설치해야 했습니다 perl-File-Rename.

내가 보는 또 다른 문제는 당신이 사용하고 있지만 -type f이것은 regular files당신이 말했듯이 디렉토리(및 하위 디렉토리)의 이름을 바꾸고 싶다는 것입니다. 따라서 -type d이 옵션을 사용하거나 지정하지 않고 모든 유형을 처리할 수 있습니다.

그래도 직접 사용하는 것은 문제가 있다는 것을 알았습니다 -exec. 당신이 사용할 때 find . -exec:

./folder2
./folder2/afolder2name-SomethingElse
./folder2/afolder2name-Misc
./folder4
./folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc
./folder4/afolder5name-Misc
./folder4/afolder5name-Misc/insideafolder5name-Misc
./folder1-Misc
./folder3
./folder3/afolder3name-Blahblah
./folder3/afolder3name-Anotherthing
./folder3/afolder3name-Misc
./folder5

위 출력은 하위 디렉터리의 이름을 바꾸려고 할 때 문제를 일으킬 수 있습니다. 예를 들면 다음과 같습니다.

/folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc

/folder4/afolder4name-Misc은(는) 이름 을 바꾸려고 시도 /folder4/afolder4name-Docs하지만 다음 path: 는 (으)로 이름이 바뀌었기 ./folder4/afolder4name-Misc/insideafolder4name-Misc때문에 오류가 발생합니다 ../folder4/afolder4name-Misc./folder4/afolder4name-Docs

이 문제에 대한 한 가지 가능한 해결책은 find복구 출력을 사용하는 것 입니다 tac. 따라서 코드는 다음과 같습니다.

find . | tac | xargs -L1 file-rename 's/(.*)\-Misc/$1-Docs/g'

위의 코드는 작동하지만 약간 느린 것으로 나타났습니다.

해결 방법 2:더 빠른 방법은 사용하는 것이지만 mv더 많은 지침이 필요합니다.

find . ! -path . | tac | while read -r dir; do \
[[ "${dir##*/}" =~ .*-Misc ]] && mv "$dir" "${dir%-Misc}-Docs";done

관련 정보