有没有一种快速的方法来确定gsutil cp无法复制哪个文件?

时间:2019-04-03 20:58:31

标签: google-cloud-storage gsutil

当我执行此命令时...

$ 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认为哪个文件无法传输。

2 个答案:

答案 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