我希望更有经验的一双眼睛能找到一些我不知道的明显的东西,或者能够帮助我解决mv
和rsync
产生的错误。迎接挑战?
基本理念:
我有一个bash脚本,我可以自动将文件从一个目录移动到另一个目录。
问题:
当我运行脚本时,我会定期从mv
命令中收到以下错误:
mv: cannot stat `/shares/directory with spaces/test file.txt': No such file or directory
。 vm
命令的错误代码是1.更奇怪的是,文件移动有时会成功。
此外,我在脚本中有一个逻辑分支,它将交替使用rsync
来移动/复制特定文件(来自与上面提到的mv
命令相同的本地文件系统源和目标)。我得到一个与stat()系统调用相关的类似错误:
rsync: link_stat "/shares/directory with spaces/test file.txt" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]
运行脚本时,此错误并不总是表现出来。有时它会完成文件移动而不会抱怨,而有时它会在脚本连续运行时一致地返回错误。
还有一个额外的成分你应该知道(我越来越怀疑这是我悲伤的一个关键因素):目录/ shares /是一个由Dropbox安装监控的目录 - 意思是它由Dropbox的安装程序监视和镜像。此时,我无法确定dropboxd
是否以某种方式锁定文件等,使其无法进行统计。为了清楚起见,文件最终会在没有进一步干预的情况下从此状态中释放出来并且mv
能够。
代码:
mv -v --no-clobber "${SOURCEPATH}${item}" "${DESTINATIONPATH}${item}"
更多信息:
以下可能或可能不相关:
mount
表示文件系统为ext4 故障排除:
在试图消除变量扩展或其内容的任何问题时,我试着像这样硬连接bash脚本:
通过mv -v --no-clobber "/shares/directory with spaces/test file.txt" "/new destination/directory with spaces/test file.txt"
验证" test file.txt"后ls -al
存在。作为参考,权限是:-rw-r - r--
不幸的是,这也会导致同样的错误。
我能想到的其他可能的问题以及我试图排除它们的所作所为:
>>可能的问题:慢速HDD(或驱动器处于低功耗模式)或外部USB驱动器
>>调查结果:驱动器是所有本地SATA磁盘设置为不停放头。此外,即使从文件系统强制执行一致读取,也会发生相同的错误
>>可能的问题:非Linux,NFS或基于熔丝的文件系统
>>调查结果: nope,source和destination在同一个本地文件系统上,mount
表示文件系统是ext4
>>可能的问题:文本路径中的空格或其他不可打印的字符
>>调查结果:验证了正确包装在引号中的源和目标路径
>>可能的问题:转义换行符后的延续问题(包裹命令后的空格)
>>调查结果:确保命令全部在一行,仍然是相同的错误
>>可能的问题: globbing(在指定要移动的文件时使用*)
>>调查结果: nope,每个文件都由路径和名称直接指定
>>可能的问题:路径混淆使用本地路径
>>调查结果: nope,文件路径从/
>>可能的问题:文件实际上并不在指定的路径中
>>调查结果: nope,在ls -al
>>可能的问题:不知何故,mv的--no-clobber导致了问题 >>调查结果: nope,尝试没有,同样的错误
>>可能的问题:只有通过Dropbox同步到文件系统创建的文件才有问题
>>调查结果: nope,直接通过touch new-local-file.txt
创建了一个本地文件,它也产生了相同的stat()错误
我的分析:
mv
和rsync
产生类似stat()错误的事实让我相信:
mv
和rsync
场景中困扰着我。 期望的结果:
1.可以确定间歇性错误的根本原因
2.根本原因可以解决或解决
3.可以改进bash脚本以便在发生错误时正常处理。