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

Is there a fast way to determine which file gsutil cp failed to copy?

当我执行这个命令时...

$ 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 认为它传输失败的文件。

您可以使用gsutil cp -L cp.log ...,它会按照here.

描述的格式记录每个操作的日志

或者,如果您只是想重新运行复制未成功传输的文件的操作,您可以考虑使用gsutil rsync command.

此解决方案的唯一缺点是您不能将并行化选项与 gsutil 一起使用,文件将按顺序上传。

gsutil cp returns 如果操作成功则为 0,否则为非 0 值。我们可以使用 $$ 运算符检查 bash 中的 return 值。

假设在sending.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