Perl 이름 바꾸기를 사용하여 파일 및 디렉터리 이름 바꾸기

Perl 이름 바꾸기를 사용하여 파일 및 디렉터리 이름 바꾸기

Perl 이름 바꾸기 명령줄 도구를 사용하여 디렉터리를 재귀적으로 검색하여 디렉터리와 발견된 파일의 이름을 바꿉니다. 내가 겪고 있는 문제는 이름 바꾸기 명령이 파일의 하위 디렉터리 이름을 바꾼 다음 동일한 파일의 상위 디렉터리 이름을 바꾸려고 한다는 것입니다. 하위 디렉터리의 이름이 변경되어 "해당 파일이나 디렉터리가 없습니다."라는 메시지가 표시되므로 이 작업은 실패합니다.

주문하다:

rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **

예를 들어, 이것은 원시 파일이고 "foo"를 "bar"로 바꾸고 싶습니다.

문서:

/test/foo/com/test/foo/FooMain.java

실패하다:

Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory

선호하는 파일:

/test/bar/com/test/bar/BarMain.java

오류 메시지를 보면 상위 디렉터리의 이름을 바꾸려고 하는데 이 시점에서 하위 디렉터리가 변경되어 파일을 찾을 수 없다는 오류가 발생한다는 것을 알 수 있습니다. 이 문제를 해결하는 rename 명령에 대한 매개변수가 있습니까? 아니면 이 문제를 다르게 해결해야 합니까?

답변1

나는 이 문제에 다르게 접근할 것입니다. 특히 쉘 globstar 대신 깊이 우선 검색을 사용합니다.**

예를 들어, GNU를 사용하면 find다음이 제공됩니다.

$ tree
.
└── dir
    ├── foo
    │   └── baz
    │       └── MainFoo.c
    └── Foo
        ├── baz
        └── MainFoo.c

5 directories, 2 files

그 다음에

find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +

밝혀지다

$ tree
.
└── dir
    ├── bar
    │   └── baz
    │       └── MainBar.c
    └── Bar
        ├── baz
        └── MainBar.c

5 directories, 2 files

답변2

언급한 대로 Perl에 대해 질문하고 sh에 코드를 표시하고 있습니다.

Perl 5를 사용하고 싶다면

  • 이 모듈은 File::Find::Rule디렉토리를 찾는 데 도움이 될 것입니다.
  • Perl이 rename나머지 작업을 수행합니다.

관련 정보