Cygwin执行mv命令报错:无法找到含$'\r'的文件,如何解决?
解决Cygwin中移动文件时的
cannot stat换行符错误 这个问题我之前帮不少人排查过——本质是Windows和Unix换行格式不兼容搞的鬼!
你看到的'filename.pdf'$'\r'里的$'\r'就是Windows格式文件的回车符(CR)。你的list.txt是用Windows编辑器保存的,每行结尾是\r\n(CRLF),但Cygwin是类Unix环境,只会把\n当作换行,\r会被当成文件名的一部分,系统自然找不到带这个特殊字符的文件,所以报错了。
下面是具体的解决步骤:
1. 先修复list.txt的换行格式
方法一:用dos2unix工具(推荐)
如果你的Cygwin里还没装dos2unix,先安装:
apt-cyg install dos2unix
然后转换文件格式:
dos2unix list.txt
这个命令会直接把Windows的CRLF换行改成Unix的LF换行。
方法二:用sed手动去除回车符
不想装工具的话,用sed命令也能快速去掉每行末尾的\r:
sed -i 's/\r$//' list.txt
2. 执行移动命令
格式修复后,再运行你原来的移动命令就正常了:
for file in $(cat list.txt); do mv "$file" destination; done
(进阶)更健壮的写法
如果你的文件名里包含空格,上面的for循环可能会出问题。推荐用while read循环来处理,同时一步完成格式转换和移动:
sed 's/\r$//' list.txt | while read -r file; do mv "$file" destination; done
这个写法先把每行的\r过滤掉,再逐行读取文件名执行移动,能兼容带空格的文件名,稳定性更强。
内容的提问来源于stack exchange,提问作者Christian Virtue
相关产品推荐
相关产品推荐

