首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用STDIN的"gsutil rm“命令

问使用STDIN的"gsutil rm“命令
EN

Stack Overflow用户
提问于 2014-03-25 18:26:10
回答 2查看 954关注 0票数 1

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

代码语言:javascript
复制
gsutil -m cp -I gs://...

在使用其他命令之前,可以将STDIN传递给gsutil以上传文件;这样做,我可以维护已上载的文件的本地列表,或者生成特定的模式来上传和传递这些文件。

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

代码语言:javascript
复制
gsutil -m rm -I gs://...

以类似的方式清除文件。目前,我构建了一个很大的文件列表来删除并使用以下代码运行它:

代码语言:javascript
复制
while read line
do
gsutil rm gs://...
done < "$myfile.txt"

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

代码语言:javascript
复制
gsutil -m rm gs://.../* # remove everything
<my command> | gsutil -m cp -I gs://.../ # put back the pieces that I want

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-25 22:26:41

作为一种临时解决方案,由于我们现在没有-I选项用于rm,那么创建一个要在循环中删除的所有对象的字符串,然后使用gsutil -m rm删除它怎么样?您还可以使用一个简单的python脚本来完成这个任务,该脚本作为一个单独的进程从python内部调用gsutil命令。

在前面的示例中进行扩展,可能如下所示(免责声明:我的bash不是最棒的,而且我还没有测试这个):

代码语言:javascript
复制
objects=''
while read line
do
  objects="$objects gs://$line"
done
gsutil -m rm $objects
票数 3
EN

Stack Overflow用户

发布于 2014-03-27 14:26:45

对于任何想知道的人来说,我最终都是像扎克·威尔特上面所说的那样。作为参考,我从5个目录中删除了几千个文件,所以大约有10,000个文件。如果不使用"-m“开关,则需要超过30分钟;使用"-m”开关时,所需时间不到30秒。变焦!

对于一个健壮的例子:我使用它来更新文件以匹配本地文件。在今天,我有一个程序,可以转储大量增量文件,也有少数文件是“卷起来”的。一周后,增量文件会在本地自动清除,但在GCS中也应该这样做,以节省空间。以下是如何做到这一点:

代码语言:javascript
复制
#!/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。显然,修改以满足您的需要。再次感谢扎克·威尔特。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22643235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档