Extraia linhas com datas específicas e execute um comando em cada uma delas

1

Estou usando um script de linha de comando do Google Drive que pode retornar uma lista de arquivos como:

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

Eu quero limpar arquivos com mais de 15 dias.

Como posso executar o seguinte comando:

drive delete --id 0Bxxxxxxxxxxxxxxxxxxxxxxxxxx

com o Id de todas as linhas que têm uma Created com mais de 15 dias de idade?

    
por Benjamin 27.12.2014 / 00:36

3 respostas

1

Você pode aparentemente usar a API do Google para listar e classificar os arquivos de acordo com suas necessidades especificamente (de drive --help ) :

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

... e do link ...

  • Pesquisar arquivos modificados depois de 4 de junho de 2012
    modifiedDate > '2012-06-04T12:00:00'    // default time zone is UTC
    modifiedDate > '2012-06-04T12:00:00-08:00'

Note que o exemplo procura arquivos mais recentes que uma data específica ...

Portanto, isso não é muito difícil, por qualquer motivo, drive parece ser capaz de manipular apenas um único argumento por chamada:

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

Eu só instalei o loop while caso você tenha muitos arquivos de unidade para manipular em uma única listagem - na maioria das vezes você facilmente o fará sem ele, mas se houver muitos, isso irá manter preenchendo a lista até que não haja mais.

O resto acontece apenas como resultado dos dados que você alimenta. Note que eu especificamente excluí as pastas aqui, mas provavelmente você vai querer ver o link mencionado também se houver algo mais que você queira ajustar.

    
por 29.12.2014 / 23:10
1

Muito simples com 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) }' 
    
por 27.12.2014 / 02:44
1

Supondo que a lista dos arquivos esteja em um arquivo chamado x.txt , um script bash da seguinte maneira poderia fazer o trabalho:

#!/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
    
por 27.12.2014 / 01:22