在包含多个子文件夹和文件的目录结构中,有些文件名带有后缀_create
(例如java1_create
),有些文件名带有_bak
(java2_bak
)。
我只需将后缀_create
为 的文件重命名_bak
,以便所有文件都应具有后缀_bak
。
有任何命令或脚本可以执行此操作吗?
答案1
在 Linux 上,假设您的文件名_create
中没有任何文件名(仅在末尾),您可以使用rename
util-linux 软件包中的实用程序,该软件包安装在所有非嵌入式 Linux 系统上。调用find
以递归方式对子目录中的所有文件执行该命令。
find -depth -exec rename _create _bak {} +
在 Debian 和派生发行版(Ubuntu、Mint 等)上,将 Perl 脚本作为 提供rename
,可以调用rename.ul
而不是rename
,或者替换rename _create _bak
为rename 's/_create$/_bak/'
。
答案2
这可能就是您所追求的:
for file in $(find . -name "*_create"); do mv -i $file ${file%%_create}_bak; done
在实际文件上使用它之前,请务必对其进行测试。
答案3
在 Debian、Ubuntu 及其衍生产品上,使用 Perl rename
,有时安装为prename
:
#enable ** globbing
shopt -s globstar
#use the rename utility
rename -n 's/_create$/_bak/' **_create
如果它按预期工作,请删除-n
(= ) 标志。--no-act
笔记:
这可能是执行此操作的最短有效的方法,特别是如果您已经shotp -s globstar
使用(我的~/.bashrc
)。
但是,您可以获得:
-bash: /usr/bin/rename: Argument list too long
如果**_create
扩展超过getconf ARG_MAX
字符长度(在我的 Linux 机器上为 2097152)。
如果是这种情况,您需要使用find -print0
with xargs -0
(请参阅lcd047 的回答)。