You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

执行mv脚本后文件丢失,含\r的异常目录无法进入问题求助

执行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脚本时,尽量用系统自带的编辑器(比如vimnano),如果一定要用Windows编辑器,记得把换行符设置为LF(比如VS Code右下角可以切换换行符模式),不然很容易再碰到这种隐形坑!

备注:内容来源于stack exchange,提问作者always-learn

火山引擎 最新活动