这应该是相对微不足道的,但我已经尝试了一段时间没有太多运气。 我有一个目录,有许多子目录,每个子目录都有自己的结构和文件。
我希望在工作目录下的任何目录中找到所有.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
文件,我不介意它是否被覆盖,或者给出了提示,选择做什么(或者是可以的,不太可能每个目录中不止一个。
我尝试过:
我调查了mv
和find
;但是,当我把它们连在一起时,我似乎做错了。我想确保将文件保存在当前位置并重命名,而不是移动。
答案 0 :(得分:21)
find
的GNU版本有一个-execdir
操作,可以将目录更改为文件所在的位置。
find . -name '*.java' -execdir mv {} test.java \;
如果您的find
版本不支持-execdir
,那么您可以通过以下方式完成工作:
find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \;
答案 1 :(得分:5)
如果您的find
命令(如我的)不支持-execdir
,请尝试以下操作:
find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \;