查找文件,原地重命名 unix bash

Posted

技术标签:

【中文标题】查找文件,原地重命名 unix bash【英文标题】:Find files, rename in place unix bash 【发布时间】:2013-02-07 01:26:44 【问题描述】:

这应该是相对微不足道的,但我已经尝试了一段时间,但运气不佳。 我有一个目录,有很多子目录,每个子目录都有自己的结构和文件。

我希望在工作目录下的任何目录中找到所有.java 文件,并将它们重命名为特定名称。 例如,我想将所有的 java 文件命名为test.java

如果目录结构如下:

./files/abc/src/abc.java
./files/eee/src/foo.java
./files/roo/src/jam.java

我想简单地重命名为:

./files/abc/src/test.java
./files/eee/src/test.java
./files/roo/src/test.java

我的部分问题是路径中可能有空格。 我不需要担心重命名文件中的类或任何内容,只需将文件名放在适当的位置即可。

如果一个目录下有多个.java文件,我不介意是否覆盖,或者给出提示,选择做什么(两者都可以,不太可能有更多每个目录中的一个以上。

我尝试过的:

我已经调查过mvfind;但是,当我将它们放在一起时,我似乎做错了。我想确保将文件保留在当前位置并重命名,而不是移动。

【问题讨论】:

【参考方案1】:

find 的 GNU 版本有一个 -execdir 操作,可以将目录更改到文件所在的位置。

find . -name '*.java' -execdir mv  test.java \;

如果您的find 版本不支持-execdir,那么您可以通过以下方式完成工作:

find . -name '*.java' -exec bash -c 'mv "$1" "$1%/*"/test.java' --  \;

【讨论】:

变量$1, % 删除了最短匹配的后缀/* - 它从$1 中删除文件名,就像dirname "$1" 一样。 /test.java 附加到该目录名称。【参考方案2】:

如果您的find 命令(如我的)不支持-execdir,请尝试以下操作:

find . -name "*.java" -exec bash -c 'mv "" "$(dirname "")"/test.java' \;

【讨论】:

这对于带引号的文件名会更安全:-exec bash -c 'mv "$1" $(dirname "$1")/test.java' -- \;

以上是关于查找文件,原地重命名 unix bash的主要内容,如果未能解决你的问题,请参考以下文章

Bash 重命名扩展递归

Bash 正则表达式重命名文件

查找和重命名没有扩展名的文件?

如果文件已重命名,如何查找文件扩展名?

如何使用 -exec 查找和重命名所有文件

SHELL:多文件的重命名和移动