【问题标题】:Google cloud storage uploading file with different file name谷歌云存储上传不同文件名的文件
【发布时间】:2014-09-30 21:51:30
【问题描述】:

我可以通过 bash 脚本上传任何具有原始文件名的文件。但是当我使用 gsutil cp 命令系统更改文件名时,会出现找不到文件的错误。

例如我的脚本是;

#!/bin/sh -x
#PATH=/root/gsutil
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export BOTO_CONFIG="/root/.boto"
NOW=$(/bin/date +"%d-%m-%Y")
LASTDB=$(/bin/find /media/bckdrv/backup/ -type f -name "db*" -printf '%p\n'| sort -n | tail -1 | cut -f2 -d" ")
/root/gsutil/gsutil cp $LASTDB gs://radb/webdb/daily/db_$NOW.GZ

我可以在终端上运行它而不会出现任何错误。但是当使用 cron 运行时,我会出现 Not found 错误。

日志如下;

+ PATH=/bin:/sbin:/usr/bin:/usr/sbin
+ export BOTO_CONFIG=/root/.boto
+ BOTO_CONFIG=/root/.boto
++ /bin/date +%d-%m-%Y
+ NOW=07-08-2014
++ /bin/find /media/bckdrv/backup/ -type f -name 'db*' -printf '%p\n'
++ sort -n
++ tail -1
++ cut -f2 '-d '
+ LASTDB=/media/bckdrv/backup/db-9755.GZ
+ /root/gsutil/gsutil cp /media/bckdrv/backup/db-9755.GZ gs://radb/webdb/daily/db_07-08-2014.GZ
+ PATH=/bin:/sbin:/usr/bin:/usr/sbin
+ export BOTO_CONFIG=/root/.boto
+ BOTO_CONFIG=/root/.boto
++ /bin/date +%d-%m-%Y
+ NOW=07-08-2014
++ /bin/find /media/bckdrv/backup/ -type f -name 'db*' -printf '%p\n'
++ sort -n
++ tail -1
++ cut -f2 '-d '
+ LASTDB=/media/bckdrv/backup/db-9755.GZ
+ /root/gsutil/gsutil cp /media/bckdrv/backup/db-9755.GZ gs://radb/webdb/daily/db_07-08-2014.GZ
Copying file:///media/bckdrv/backup/db-9755.GZ [Content-Type=application/x-gzip]...
Failure: list index out of range.
Copying file:///media/bckdrv/backup/db-9755.GZ [Content-Type=application/x-gzip]...
Failure: list index out of range.

如果我更改脚本的最后一行

/root/gsutil/gsutil cp $LASTDB gs://radb/webdb/daily/db_$NOW.GZ

/root/gsutil/gsutil cp $LASTDB gs://radb/webdb/daily/

脚本可以使用原始文件名成功上传。

那么我该如何解决这个问题呢?我不想更改我本地的原始文件名。

【问题讨论】:

  • 作为一种解决方法,尝试将文件复制到本地,重命名副本并上传,然后在本地删除。

标签: bash google-cloud-storage gsutil


【解决方案1】:

据我了解,目的是将单个文件复制到 GCS。脚本不能进一步简化吗?我做了一个类似的测试,我将一个日志文件直接复制到云存储桶中,同时通过添加时间来更改它的名称。我在这个过程中没有任何问题,cron 能够每分钟运行一次(用于测试)。在我的示例中,我使用单个命令完成所有操作,我知道您可能需要像使用 DB 变量一样添加一些排序,或者找到一种不同的方式来指定相关文件。

示例如下:

#!/bin/bash
# Description: Copy specified log file to GCS
NOW=$(/bin/date +"%d-%m-%Y")

/usr/local/bin/gsutil cp /var/log/logfilename gs://bucketname/filename$NOW

【讨论】:

  • 嗨,这和我的脚本一样。我的 LASTDB 变量只查找最后一个备份文件名。
  • 如果你运行这两个脚本,它们会产生同样的错误吗?
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 2019-06-09
  • 1970-01-01
  • 2018-06-16
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多