在使用gsutil上传大量图片后,我遇到了一个奇怪的问题 - 上传的文件无法通过Google云端控制台看到,如果我尝试执行'gsutil ls',gsutil本身会抱怨。我99%确定它与使用“å”或“Å”以及目录名中的空格有关。
所有上传都是从根文件夹(多级子目录中的大型图像集合)递归完成的。如果我再次尝试上传文件,gsutil会跳过它们,因为它们已经存在,所以上传功能会某些东西 - 它的工作方式与列表和下载不同。
一个例子:
gsutil cp -R -n /Volumes/Photos/digitalfotografen.dk/2009/2009-05-30\ Søgården\ -\ bryllup/ gs://digitalfotografen/2009/
Skipping existing item: gs://digitalfotografen/2009/2009-05-30 Søgården - bryllup/Søgården 0128.CR2
...
确定 - 因此文件存在,但通过Google Cloud Console浏览目录会显示“无结果”。
此外:
gsutil ls gs://digitalfotografen/2009/2009-06-27 Søgården - reklamefotos/20090627_IMG_0128.CR2
CommandException: "ls" command does not support "file://" URIs. Did you mean to use a gs:// URI?
我尝试以不同方式转义空格并使用引号,但没有运气。
现在,这是有趣的事情:
gsutil cp -R -n /Volumes/Photos/digitalfotografen.dk/2009/2009-05-30\ Søgården\ -\ bryllup/ gs://digitalfotografen/2009/
Copying file:///Volumes/Photos/digitalfotografen.dk/2009/2009-05-30 Søgården - bryllup/Søgården 0128.CR2 [Content-Type=application/octet-stream]...
在这里,我专门用 source 侧的转义空格复制了文件夹,现在再次上传文件。这将创建一个具有相同名称的第二个文件夹(至少在云端控制台中显示),现在可以在两个文件夹中看到这些文件。
我们在丹麦字符集(“æøå”和首都“ÆØÅ”)中使用标准US ASCII之外的三个不同字符,但问题仅似乎影响“å”和“ Å“ - 其他两个人或单独组合工作正常。我的预感是“å”和“Å”可能会转换成完全不同的ASCII格式,当允许gsutil根据根文件夹的名称自行处理目录命名时(抛出多级递归) )但在用户指定根文件夹的转义名称时有效。
这可能是一个python问题,而不是gsutil问题,但我没有资格识别这个,因为我对一些大杂烩shell脚本之外的编程知识非常接近。
答案 0 :(得分:0)
我们在gsutil进入ubuntu wsl版本Windows 10时遇到了麻烦。 gsutil命令可以完美地在外壳程序中运行,但是在外壳程序脚本中包含以下命令时则不起作用:
gsutil -m ls -lr gs://project.appspot.com/
错误:
commandexception: "ls" command does not support "file://" urls. did you mean to use a gs:// url?
一种解决方法是直接调用脚本/ usr / lib / google-cloud-sdk / platform / gsutil / gsutil,而不调用链接/ usr / bin / gsutil:
/usr/lib/google-cloud-sdk/platform/gsutil/gsutil -m ls -lr gs://project.appspot.com/
我不知道为什么,但是它在起作用。
感谢马里昂(Marion)为我们提供了一个如此罕见的错误:-)
答案 1 :(得分:0)
我知道这是一个旧错误,但我遇到了与上述类似的问题。
CommandException: "ls" command does not support "file://" URLs. Did you mean to use a gs:// URL?
使用 Scala 代码中的 gsutil
。
import sys.process._
object Main {
def main(args: Array[String]): Unit = {
val clients = s"gsutil ls gs://<bucket name>".!!
val beforeDate: String = "date +%Y-%m-%d -d '-8 days'".!!
val clientList = clients.split("\n").map(f => f.split('/').apply(1)).toList
for (x <- clientList) {
val countImg = (s"gsutil -m ls gs://<bucket name>/$x/${beforeDate.stripLineEnd}" #| "wc -l").!!
println(countImg)
}
}
}
所以我发现 LineEnd
上有一个 beforeDate
字符,当我对错误进行条带化时,错误消失了。因此,当 gs://...
路径中有“特殊”字符时会发生错误。所以一定要去掉任何“特殊”字符的变量。
而这一切的发生只是因为我懒得使用 java.time.LocalDate
来生成 beforeDate
变量。希望这里的内容可以帮助遇到相同错误的其他人。