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; 但是,当我将它们放在一起时,我似乎做错了。我想确保将文件保留在当前位置并重命名,而不是移动。

4

2 回答 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' -- {} \;
于 2013-02-21T16:18:14.787 回答
5

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

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \;
于 2013-02-21T16:23:23.763 回答