我使用 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
將幫助您查找將幫助您查找目錄。 - Perl
rename
將完成剩下的工作。