如何在gsutil rsync中包含文件?

时间:2015-12-05 21:46:54

标签: google-cloud-storage

gsutil rsync有一个“exclude”选项(-x),但没有“include”选项。 是否有一些方法可以包含所选文件而不会使整个目录同步? 除了所需文件之外的所有文件都不起作用,因为随机文件将保存到该目录。

https://cloud.google.com/storage/docs/gsutil/commands/rsync

5 个答案:

答案 0 :(得分:4)

目前没有"包括" gsutil rsync的选项。

答案 1 :(得分:1)

解决方法是创建一个rsync_include_files目录并用符号链接填充文件。然后rsync rsync_include_files目录:

$GSUTIL rsync -c -C $SOURCE/rsync_include_files/
$DESTINATION/rsync_include_files/

但有一点需要注意。 从备份恢复数据时,文件是符号链接所在的位置,符号链接将丢失。 要完成恢复,需要手动移动文件并重新创建符号链接。

答案 2 :(得分:1)

或者您可以将文件名列表存储在一个数组中,并使用python的负向前瞻断言排除该数组,文件名由|

分隔
  

https://ask.fedoraproject.org/en/question/92498/include-top-directory-files-in-a-backup/

我有一个类似的情况,一行一行的文件复制得太长了。我通过运行

创建一个包含文件列表的数组来接近它
gsutil ls gs://<bucket_name>/<file_construct>

然后通过使用|

分隔数组元素来创建单个变量
gsutil -m rsync -c -x ""^(?!${REGEX_INV_EXCLUSION_LST}$).*'" "gs://${source}/" "${dest}/"

答案 3 :(得分:0)

@wolfv - “是否有某种方法可以在不对整个目录进行rsyn的情况下包含所选文件?”

这将允许您排除除您明确要求的文件之外的所有文件:

fx=""
while read f; do
    if ! [[ "$f" = "thefileiwanttorsync" ]]; then
        [[ ${fx} = "" ]] || fx+="|" 
        fx+="^${f}\$"
    fi
done < <(ls -1 /directory/path) 

gsutil rsync -x "${fx[@]}" /directory/path  gs://bucket/some/directory/path

@wolfv - “除了所需文件之外的所有文件都不起作用,因为随机文件将保存到该目录。”

我理解第一句话,但不是第二句。

答案 4 :(得分:0)

如果您知道要同步的单个文件的名称,则无需执行Balajee建议的ls命令。只需在反向正则表达式中指定基本文件名即可:

    public async Task<IEnumerable<T>> GetAll<T>(string tableName) where T : class
    {
        var table = this.GetCloudTable(tableName);
        TableContinuationToken token = null;
        do
        {
            var q = new TableQuery<T>();
            var queryResult = await table.ExecuteQuerySegmentedAsync(q, token);
            foreach (var item in queryResult.Results)
            {
                yield return item;
            }
            token = queryResult.ContinuationToken;
        } while (token != null);
    }

此处的示例:https://github.com/GoogleCloudPlatform/gsutil/issues/532#issuecomment-394039557