使用find和rename重命名文件时出现“No such file or directory”错误排查
问题:批量重命名JSON文件时提示
rename命令不存在 现有文件
ui-service-3.100.503505.json kibana-store-end-3.103.103505.json api-application-3.4003.10350665.json
执行的命令
find . -type f -iname "*.json" -exec rename 's/[0-9]//g' {} \;
错误信息
find: ‘rename’: No such file or directory
期望输出文件名
ui-service.json kibana-store-end.json api-application.json
问题原因与解决办法
1. rename命令不存在的核心原因
不同系统的rename工具差异极大:
- Debian/Ubuntu默认预装Perl版本的
rename,但RHEL/CentOS/Fedora、macOS等系统默认没有这个命令,或自带的rename语法完全不同。 - 你当前的系统未安装对应版本的
rename,导致find找不到该命令。
2. 通用兼容方案(无需依赖rename)
用find+bash+sed实现需求,适配绝大多数系统:
find . -type f -iname "*.json" -exec bash -c ' for file do newname=$(echo "$file" | sed -E "s/-[0-9.]+//g") mv "$file" "$newname" done ' bash {} +
sed -E "s/-[0-9.]+//g":精准匹配文件名中-开头、后续跟着数字和.的版本号段,直接替换为空,完全符合你的需求。- 用
bash -c批量循环处理文件,比逐个执行exec效率更高。
3. 若坚持使用rename的针对性方案
- Debian/Ubuntu系统:修正正则后直接用原逻辑(你之前的正则只删数字,没处理
-和.):find . -type f -iname "*.json" -exec rename 's/-[0-9.]+//g' {} \; - RHEL/CentOS/Fedora系统:先安装
util-linux包获取rename,再用其专属语法:sudo dnf install util-linux find . -type f -iname "*.json" -exec rename '-[0-9.]+' '' {} \; - macOS系统:通过Homebrew安装Perl版
rename,再执行修正后的命令:brew install rename find . -type f -iname "*.json" -exec rename 's/-[0-9.]+//g' {} \;
内容的提问来源于stack exchange,提问作者Chel MS
相关产品推荐
相关产品推荐

