使用 rename 重命名文件和目录

Bob*_*ke4 3 bash recursive rename

我正在使用 Linux 重命名命令行工具递归搜索目录以重命名它找到的任何目录和文件。我遇到的问题是重命名命令将重命名文件的子目录,然后尝试重命名同一文件的父目录。这将失败,因为子目录已被重命名,导致“没有这样的文件或目录”

命令:

rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **
Run Code Online (Sandbox Code Playgroud)

例如,这是一个原始文件,我想用 'bar' 替换 'foo'

文件:

/test/foo/com/test/foo/FooMain.java
Run Code Online (Sandbox Code Playgroud)

失败:

Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory
Run Code Online (Sandbox Code Playgroud)

首选文件:

/test/bar/com/test/bar/BarMain.java
Run Code Online (Sandbox Code Playgroud)

您可以从错误消息中看到它正在尝试重命名父目录,但此时子目录已经更改,导致找不到文件错误。重命名命令是否有参数可以解决这个问题,还是我需要以不同的方式解决这个问题?

ste*_*ver 7

我会以不同的方式解决这个问题 - 具体来说,使用深度优先搜索代替 shell globstar **

例如,使用 GNU find,给定:

$ tree
.
??? dir
    ??? foo
    ?   ??? baz
    ?       ??? MainFoo.c
    ??? Foo
        ??? baz
        ??? MainFoo.c

5 directories, 2 files
Run Code Online (Sandbox Code Playgroud)

然后

find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +
Run Code Online (Sandbox Code Playgroud)

结果是

$ tree
.
??? dir
    ??? bar
    ?   ??? baz
    ?       ??? MainBar.c
    ??? Bar
        ??? baz
        ??? MainBar.c

5 directories, 2 files
Run Code Online (Sandbox Code Playgroud)