提取具有特定日期的行并对每个日期执行命令

提取具有特定日期的行并对每个日期执行命令

我正在使用一个Google 云端硬盘命令行脚本可以返回文件列表,例如:

Id                             Title                       Size     Created
0Bxxxxxxxxxxxxxxxxxxxxxxxxxx   backup-2014-12-26.tar.bz2   569 MB   2014-12-26 18:23:32

我想清除超过 15 天的文件。

我怎样才能执行以下命令:

drive delete --id 0Bxxxxxxxxxxxxxxxxxxxxxxxxxx

与日期超过 15 天Id的所有行的?Created

答案1

您显然可以使用 Google api 根据您的需要专门列出和排序文件(从drive --help:

list:
    -m, --max      Max results
    -q, --query    Query (see https://developers.google.com/drive/search-parameters)

...并且从链接...

  • 搜索 2012 年 6 月 4 日之后修改的文件
    moddedDate > '2012-06-04T12:00:00' // 默认时区为 UTC
    修改日期 > '2012-06-04T12:00:00-08:00'

请注意,该示例搜索文件较新的比某个日期...

因此,这根本不是很困难,但无论出于何种原因,drive每次调用似乎只能处理一个参数:

mdate_list() { drive list -nq \
    "modifiedDate $1 '$(date -ud"$2" '+%FT%T')' and \
     mimeType != 'application/vnd.google-apps.folder'"
}  
rmdrv() for dfile do drive delete -i "$dfile" || return; done

set -f; unset IFS            #no split data mangling, please
while   set -- $(mdate_list \< '15 days ago'|cut -d\  -f1)  
        [ "$#" -gt 0 ]
do      rmdrv "$@" || ! break
done

我只是while在单个列表中需要处理太多驱动器文件的情况下才建立了循环 - 大多数情况下您可以轻松地不用它,但如果有很多,这将继续填充列表,直到有不再。

剩下的事情只是根据您提供的数据而发生。请注意,我在此处专门排除了文件夹,但如果您还需要调整任何其他内容,您可能还需要查看提到的链接。

答案2

非常简单与awk

drive list |\
awk 'BEGIN{ "date +%s -d -15\\ days" | getline n }
        $6{ m=$5"\\ "$6
            ("date +%s -d "m) | getline t
            if(t < n) system("drive delete -id "$1) }' 

答案3

假设文件列表位于名为 的文件中x.txt,则以下 bash 脚本可以完成该工作:

#!/bin/bash

IFS="\n"
for i in $(cat x.txt)
do
    fid=$(echo $i | awk '{print $1}') # extract the file id
    d=$(echo $i | awk '{print $5}') # extract the date filed
    d2=$(date -d "$d" +%s)  # convert it to epoch sec

    now=$(date +%s) # current time in epoch sec
    diff=$(( (now - d2) / 86400 )) # find diff and convert it to days
    echo "The file $fid is $diff days old"
    if (( $diff > 15 )) #if the diff is greater than 15 
    then
      #delete file
      drive delete --id $fid
    fi
done

相关内容