gsutil rsync 'ascii' 编解码器无法解码位置 51 中的字节 0xe2:序数不在范围内(128)
Posted
技术标签:
【中文标题】gsutil rsync \'ascii\' 编解码器无法解码位置 51 中的字节 0xe2:序数不在范围内(128)【英文标题】:gsutil rsync 'ascii' codec can't decode byte 0xe2 in position 51: ordinal not in range(128)gsutil rsync 'ascii' 编解码器无法解码位置 51 中的字节 0xe2:序数不在范围内(128) 【发布时间】:2021-06-22 05:52:24 【问题描述】:我正在使用我的 Debian 服务器中的 gsutil 命令将 rsync 文件传输到 GCP 存储桶,但它因以下错误而失败:
gsutil -m rsync -r -n files/ gs://my-bucket/files
At source listing 10000...
At source listing 20000...
At source listing 30000...
Caught non-retryable exception while listing file://files/: 'ascii' codec can't decode byte 0xe2 in position 51: ordinal not in range(128)
CommandException: Caught non-retryable exception - aborting rsync
gsutil 版本:4.52
大约需要传输 1TB 数据。
【问题讨论】:
您尝试过更新的 gsutl 吗? 4.52 是 9 个月和 9 个旧版本。 是的,现在更新到 gsutil 版本:4.60 仍然出现同样的错误。 它完全一样吗?我认为他们已经重新访问了错误消息以包含导致问题的文件,您可以检查一下吗?您是否还在运行受支持的 python 版本之一(Python 3(首选,3.5 到 3.8)和 Python 2(2.7.9 或更高版本))? 是的,完全相同的错误,这是服务器上的 Python 2.7.9 版本。 bucket中是否有包含非asci字符的文件? 【参考方案1】:我通过遵循 php 代码解决了我自己的问题,该代码将迭代源目录并移动查找非 ascii 文件名并将它们移动到不同的位置。
也可以从文件名中删除非ASCII字符并使用相同的逻辑重命名,或者可以使用unlink方法删除。
<ul>
<?php
// this will help you to debug the code if you get some errors.
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
$source = 'source_files/'; // update this with your source path.
$iterator = new RecursiveTreeIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS));
$dest = 'destination_path'; // update it with your destination path
foreach($iterator as $filename => $path)
if(preg_match('/[^\x20-\x7e]/', $path))
echo "<li>".$filename."</li>";
// rename($filename, $dest.pathinfo($filename, PATHINFO_BASENAME)); // Uncomment if you want to move it with some other location.
// unlink($filename); // Uncomment if you want to delete that file.
?>
</ul>
注意:确保您已为源目录和目标目录设置了正确的权限。
希望将来能对某人有所帮助。
谢谢
【讨论】:
以上是关于gsutil rsync 'ascii' 编解码器无法解码位置 51 中的字节 0xe2:序数不在范围内(128)的主要内容,如果未能解决你的问题,请参考以下文章
“UnicodeEncodeError:‘ascii’编解码器无法编码字符”