如何用Bash批量将所有子文件夹与文件的首字母大写?
递归重命名所有文件和文件夹(首字母大写)
你可以用以下几种方法实现递归处理所有子目录的文件和文件夹:
方法1:使用find命令(最可靠)
find的-depth选项会让它先处理子目录内的内容,再处理父目录,避免因父目录重命名导致子路径失效的问题:
find . -depth -exec rename -f 's/./\U$&/' {} +
-depth:确保从最深层的子目录开始处理,向上遍历-exec ... {} +:将找到的所有文件/目录批量传递给rename命令,提升效率
方法2:使用Bash的globstar扩展
如果你的Bash版本支持globstar(一般Bash 4.0+默认开启,可通过shopt -s globstar手动开启),可以用递归通配符**匹配所有子目录:
shopt -s globstar # 先处理深层路径,避免父目录重命名后子路径失效 for path in $(find . -depth | grep -v '^\.$'); do rename -f 's/./\U$&/' "$path" done
或者更简洁的方式(但需注意路径顺序,可能需要先排序):
shopt -s globstar rename -f 's/./\U$&/' **/*
注意:直接用
**/*可能会因先重命名父目录导致部分子路径无法找到,因此优先推荐find的-depth方案。
关键细节说明
- 你的原命令
s/./\U$&/是Perl风格的正则替换,\U$&会将匹配到的第一个字符(.匹配任意单个字符,即文件名首字符)转换为大写,这个逻辑是正确的。 - 确保你使用的是Perl版本的
rename(大部分Linux发行版默认是),如果是util-linux版本的rename,语法会不同,需要调整正则表达式格式。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

