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

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

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

명령:

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

오류 메시지에서 상위 디렉터리의 이름을 바꾸려고 시도하고 있지만 그 시점에서 하위 디렉터리가 이미 변경되어 파일을 찾을 수 없다는 오류가 발생했음을 알 수 있습니다. 이 문제를 해결하는 이름 바꾸기 명령에 대한 매개변수가 있습니까? 아니면 다른 방식으로 이 문제를 해결해야 합니까?

답변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나머지 작업을 수행합니다.

관련 정보