我可以通过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 error。
日志在下面;
+ 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/
脚本可以使用原始文件名成功上传。
那么我该如何解决这个问题呢?我不想更改本地文件名。
答案 0 :(得分: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