find命令搭配-exec mv执行重命名操作会删除原文件吗?
命令错误原因
你执行的命令find . -name "*.XML" -exec mv {} ADI.XML \;的核心问题是mv的目标路径使用了相对路径:
mv命令的目标路径ADI.XML默认相对于你执行find命令的工作目录(也就是/u0x/XMLs根目录),而非每个匹配文件所在的子目录- find每遍历到一个匹配的XML文件,就会把它移动到
/u0x/XMLs根目录下并重命名为ADI.XML,后移动的文件会直接覆盖前一次生成的ADI.XML - 最终原各子目录里的匹配文件都会被移走,且只会在
/u0x/XMLs根目录留下最后一个被处理的文件,其余所有文件都会被覆盖删除
文件恢复方案
- 第一时间停止对
/u0x目录所在磁盘的所有写入操作,避免被删除文件的数据块被新数据覆盖 - 可使用
testdisk、extundelete(仅适用于ext4文件系统)等本地数据恢复工具扫描磁盘分区尝试恢复被覆盖的文件,若磁盘在命令执行后没有新增写入,恢复成功率较高
正确的批量重命名命令
推荐使用-execdir参数替代-exec,该参数会在每个匹配文件所在的子目录执行后续命令,避免路径错误:
- 先执行以下命令确认匹配的文件符合预期,避免误操作:
find . -name "PROCESSED_ADI.XML" -print
- 确认无误后执行重命名操作:
find . -name "PROCESSED_ADI.XML" -execdir mv {} ADI.XML \;
内容的提问来源于stack exchange,提问作者SaNu
相关产品推荐
相关产品推荐

