查找文件,原地重命名 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
文件,我不介意是否覆盖,或者给出提示,选择做什么(两者都可以,不太可能有更多每个目录中的一个以上。
我尝试过的:
我已经调查过mv
和find
;但是,当我将它们放在一起时,我似乎做错了。我想确保将文件保留在当前位置并重命名,而不是移动。
【问题讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章