当我执行此命令时...
$ cat sending.csv | gsutil -m cp -I gs://my-bucket/
我得到这样的输出...
Copying file://000000000077.jpg [Content-Type=image/jpeg]...
CommandException: No URLs matched:
Copying file://000000000086.jpg [Content-Type=image/jpeg]...
...
Copying file://000000002536.jpg [Content-Type=image/jpeg]... ETA 00:00:00
| [261/261 files][ 41.1 MiB/ 41.1 MiB] 100% Done 3.7 MiB/s ETA 00:00:00
Operation completed over 261 objects/41.1 MiB.
CommandException: 1 file/object could not be transferred.
我需要知道哪个文件传输失败,但是我看不到获取此信息的简便方法。
成功传输错误消息之前和之后的文件
$ gsutil ls gs://my-bucket/000000000077.jpg
gs://my-bucket/000000000077.jpg
$ gsutil ls gs://my-bucket/000000000086.jpg
gs://my-bucket/000000000086.jpg
并且sending.csv文件中没有文件。
$ cat sending.csv | nl | head
...
5 000000000077.jpg
6 000000000086.jpg
我尝试将-D选项传递给gsutil,但是输出太多,无法快速找到无法复制的单个文件。
我做了以下操作,将要发送的文件列表与存储在存储桶中的列表进行比较:
gsutil ls gs://my-bucket/*.jpg | sort | sed 's!.*/!!' > sent.csv
diff sending.csv sent.csv
但未发现差异。
我想知道gsutil认为哪个文件无法传输。
答案 0 :(得分:1)
您可以使用gsutil cp -L cp.log ...
,它将以here所述的格式记录每个操作的日志。
或者,如果您只想重新运行该操作以复制未成功传输的文件,则可以考虑使用gsutil rsync command。
答案 1 :(得分:1)
该解决方案的唯一缺点是您不能将并行化选项与gsutil一起使用,并且文件将按顺序上传。
gsutil cp
如果操作成功,则返回0,否则返回非0值。我们可以使用$$
运算符以bash形式检查此返回值。
假设send.csv中每行包含一个文件:
#!/bin/sh
while read line
do
echo $line;
gsutil cp $line gs://my-bucket/
if [ $? -eq 0 ]
then
echo "$line successfully uploaded"
else
echo "Houston, we have a problem"
fi
done < files.csv