0

我可以通过 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/

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

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

4

1 回答 1

0

据我了解,目的是将单个文件复制到 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
于 2014-08-07T20:36:13.003 回答