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)
您可以从错误消息中看到它正在尝试重命名父目录,但此时子目录已经更改,导致找不到文件错误。重命名命令是否有参数可以解决这个问题,还是我需要以不同的方式解决这个问题?
我会以不同的方式解决这个问题 - 具体来说,使用深度优先搜索代替 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)