使用 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将完成剩下的工作。

相关内容