1

我在 Linux 环境中使用 gsutil 来管理 GCS 中的文件。我喜欢能够使用命令

gsutil -m cp -I gs://...

在其他一些命令之前将 STDIN 传递给 gsutil 以上传文件;这样做时,我可以维护已上传文件的本地列表或生成特定模式以上传和移交它们。

我希望能够执行类似的命令

gsutil -m rm -I gs://...

类似地擦洗文件。目前,我构建了一个大文件列表以删除并使用以下代码运行它:

while read line
do
gsutil rm gs://...
done < "$myfile.txt"

与多线程“gsutil -m rm...”命令相比,这非常慢,并且当您必须一次处理一个列表中的文件时,启用 -m 标志无效。我也尝试过跑步

gsutil -m rm gs://.../* # remove everything
<my command> | gsutil -m cp -I gs://.../ # put back the pieces that I want

但这涉及重新复制大量数据并浪费大量时间;数据已经存在,只需要删除一些。任何想法将不胜感激。另外,我在重命名文件的两端都没有很大的灵活性。否则,在上传之前快速重命名将处理所有这些。

4

2 回答 2

3

作为一个临时解决方案,由于我们现在没有-I选项rm,如何在循环中创建一个包含所有要删除的对象的字符串,然后使用gsutil -m rm它来删除它?您也可以使用一个简单的 python 脚本来执行此操作,该脚本从 python 中调用 gsutil 命令作为一个单独的进程。

扩展您之前的示例,可能类似于以下内容(免责声明:我的 bash-fu 不是最好的,我还没有测试过):

objects=''
while read line
do
  objects="$objects gs://$line"
done
gsutil -m rm $objects
于 2014-03-25T22:26:41.193 回答
1

对于任何想知道的人,我最终会像上面提到的 Zach Wilt 那样做。作为参考,我从 5 个目录中删除了大约几千个文件,因此大约有 10,000 个文件。在没有“-m”开关的情况下执行此操作需要 30 分钟以上;使用“-m”开关,只需不到 30 秒。飞涨!

举一个可靠的例子:我正在使用它来更新 Google Cloud Storage 文件以匹配本地文件。今天,我有一个程序可以转储大量增量文件,以及一些“卷起”的文件。一周后,增量文件会自动在本地清理,但在 GCS 中也应该这样做以节省空间。以下是如何执行此操作:

#!/bin/bash

# get the full date strings for touch
start=`date --date='-9 days' +%x`
end=`date --date='-8 days' +%x`

# other vars
mon=`date --date='-9 days' +%b | tr [A-Z] [a-z]`
day=`date --date='-9 days' +%d`

# display start and finish times
echo "Cleaning files from $start"

# update start and finish times
touch --date="$start" /tmp/start1
touch --date="$end" /tmp/end1

# repeat for all servers
for dr in "dir1" "dir2" "dir3" ... 
do

    # list files in range and build retention file
    find /local/path/$dr/ -newer /tmp/start1 ! -newer /tmp/end1 > "$dr-local.txt"

    # get list of all files from appropriate folder on GCS
    gsutil ls gs://gcs_path/$mon/$dr/$day/ > "$dr-gcs.txt"

    # formatting the host list file
    sed -i "s|gs://gcs_path/$mon/$dr/$day/|/local/path/$dr/|" "$dr-gcs.txt"

    # build sed command file to delete matches
    while read line
    do
        echo "\|$line|d" >> "$dr-del.txt"
    done < "$dr-local.txt"

    # run command file to strip lines for files that need to remain
    sed -f "$dr-del.txt" <"$dr-gcs.txt" >"$dr-out.txt"

    # convert local names to GCS names
    sed -i "s|/local/path/$dr/|gs://gcs_path/$mon/$dr/$day/|" "$dr-out.txt"

    # new variable to hold string
    del=""

    # convert newline separated file to one long string
    while read line
    do
        del="$del$line "
    done < "$dr-out.txt"

    # remove all files matching the final output
    gsutil -m rm $del

    # cleanup files
    rm $dr-local.txt
    rm $dr-gcs.txt
    rm $dr-del.txt
    rm $dr-out.txt

done

您需要进行修改以满足您的需求,但这是一种在本地删除文件,然后将更改同步到 Google Cloud Storage 的具体且有效的方法。显然,修改以适应您的需求。再次感谢@Zach Wilt。

于 2014-03-27T14:26:45.143 回答