Bash

使用 Perl rename 重命名文件和目錄

  • February 21, 2022

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

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

我會以不同的方式解決這個問題 - 具體來說,使用深度優先搜尋代替 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

引用自:https://unix.stackexchange.com/questions/366780