在Unix Bash中查找文件并重命名

10
这应该相对比较简单,但我已经尝试了一段时间,没有太多的好运。
我有一个目录,其中包含许多子目录,每个子目录都有自己的结构和文件。
我想要查找工作目录下任何目录中的所有.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,但是当我将它们连接在一起时,似乎做错了。我想确保将文件保留在其当前位置并进行重命名,而不是移动。
2个回答

23
GNU版本的find命令有一个-execdir选项,可以将当前目录更改为文件所在的目录。
find . -name '*.java' -execdir mv {} test.java \;

如果你的 find 版本不支持 -execdir,那么你可以使用以下方式完成工作:
find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \;

2
变量$1%会删除最短匹配的后缀/*,就像dirname "$1"一样从$1中去掉文件名。然后将/test.java附加到该目录名。 - John Kugelman

5

如果你的find命令(和我的一样)不支持-execdir,请尝试以下方法:

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

这样做可以更安全地处理带引号的文件名:-exec bash -c 'mv "$1" $(dirname "$1")/test.java' -- {} \; - John Kugelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接