嵌套目录下批量重命名文件的路径失效问题求解
嵌套目录批量重命名的路径失效问题解决办法
问题场景
现有嵌套目录结构如下:
. └── key_A ├── data_A │ ├── d0_A.txt │ └── d1_A.txt ├── image_A.txt └── text_A.txt
需要将所有文件名/目录名中的'A'替换为'B',直接执行以下命令会报错:
find . -name '*A*' -exec rename 's/A/B/g' '{}' ';'
错误信息:
find: ‘./key_A’: No such file or directory
原因是find默认从上到下遍历目录,先重命名了上层的key_A为key_B,后续遍历原路径时找不到对应目录。
简便解决方案
使用find的-depth参数,让它从最深层的文件/目录开始处理,再逐层向上处理父目录:
find . -depth -name '*A*' -exec rename 's/A/B/g' '{}' ';'
执行顺序说明
- 先处理最内层的
d0_A.txt、d1_A.txt,重命名为d0_B.txt、d1_B.txt - 接着处理
data_A目录,重命名为data_B - 然后处理
image_A.txt、text_A.txt,重命名为image_B.txt、text_B.txt - 最后处理最上层的
key_A目录,重命名为key_B
全程所有操作的路径都是有效的,不会出现找不到目录的错误。
可选预览操作
如果想先确认重命名结果,避免误操作,可以给rename加上-n(预览)和-v(详细输出)参数:
find . -depth -name '*A*' -exec rename -nv 's/A/B/g' '{}' ';'
确认输出符合预期后,去掉-n执行实际重命名即可。
内容的提问来源于stack exchange,提问作者Paweł Wójcik
相关产品推荐
相关产品推荐

