执行mv脚本后文件丢失,含\r的异常目录无法进入问题求助
兄弟我之前也踩过一模一样的坑!这百分百是Windows换行符(CR/LF)搞的鬼——你的filename.sh应该是在Windows环境下编辑的,传到Linux/Unix系统后,每一行命令的末尾都偷偷带了个\r(回车符),才导致了这一连串问题。
问题根源拆解:
你写的mv /home/newdir/test1.jpg /home/backupdir,实际执行的时候变成了mv /home/newdir/test1.jpg /home/backupdir\r——系统把/home/backupdir\r当成了完整的目标目录名,所以创建了这个藏着\r字符的异常目录,你的所有图片其实都移到这里面了,只是正常的ls命令不会显示这个不可见的\r,才让你误以为文件丢了。
解决步骤:
先确认异常目录的存在:
执行ls -b /home,这个命令会把所有不可见字符显示出来,你就能看到那个标注为backupdir$'\r'的异常目录了。进入这个异常目录:
直接用cd加目录名会报错,得用特殊语法把\r转义:cd $'/home/backupdir\r'或者如果当前目录下只有这一个以
backupdir开头的目录,也可以用通配符偷懒:cd /home/backupdir*找回文件并清理异常目录:
进入目录后,把图片移到正常的backupdir里(如果还没创建正常目录,先执行mkdir /home/backupdir):mv *.jpg /home/backupdir/然后回到上级目录删除这个异常目录:
cd /home && rmdir $'backupdir\r'修复你的脚本避免再踩坑:
把脚本里的Windows换行符转换成Unix格式,用dos2unix工具最方便:dos2unix filename.sh如果系统没装
dos2unix,也可以用sed命令手动替换:sed -i 's/\r$//' filename.sh
小提醒:
以后编辑Linux/Unix脚本时,尽量用系统自带的编辑器(比如vim、nano),如果一定要用Windows编辑器,记得把换行符设置为LF(比如VS Code右下角可以切换换行符模式),不然很容易再碰到这种隐形坑!
备注:内容来源于stack exchange,提问作者always-learn




