查找文件,在unix bash中重命名

The*_*son 9 unix bash rename mv

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

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

如果目录结构是:

./files/abc/src/abc.java
./files/eee/src/foo.java
./files/roo/src/jam.java
Run Code Online (Sandbox Code Playgroud)

我想简单地重命名为:

./files/abc/src/test.java
./files/eee/src/test.java
./files/roo/src/test.java
Run Code Online (Sandbox Code Playgroud)

当然,我的部分问题是路径可能有空格.我不需要担心重命名文件中的类或任何内容,只需要文件名.

如果目录中有超过1个.java文件,我不介意它是否被覆盖或者是否给出了选择要做的提示(要么是好的,每个目录中不可能有超过1个.

我尝试过的:

看着mv并找到,但是当我把它们管在一起时,我似乎做错了,我想确保将它们保留在当前位置并重命名,而不是移动.

谢谢,我真的很感激任何帮助.

Joh*_*ica 21

GNU版本find具有将-execdir目录更改为文件所在位置的操作.

find . -name '*.java' -execdir mv {} test.java \;
Run Code Online (Sandbox Code Playgroud)

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

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \;
Run Code Online (Sandbox Code Playgroud)

  • 变量`$ 1`,`%`删除最短的匹配后缀`/*` - 它将文件名从'$ 1`中删除,如`dirname"$ 1"`会这样做.`/ test.java`附加到该目录名称. (2认同)

dog*_*ane 5

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

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