使用 Perl rename 重新命名檔案和目錄

使用 Perl rename 重新命名檔案和目錄

我使用 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

您可以從錯誤訊息中看到它正在嘗試重命名父目錄,但此時子目錄已更改,導致檔案未找到錯誤。重命名命令是否有參數可以解決此問題,或者我是否需要以不同的方式解決此問題?

答案1

我會用不同的方式來解決這個問題 - 具體來說,使用深度優先搜尋代替 shell 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將幫助您查找將幫助您查找目錄。
  • Perlrename將完成剩下的工作。

相關內容