Comando Unix para localizar e excluir pastas com nomes de pastas no formato de data

0

Eu tenho nomes de pastas no formato de data abaixo

20130801
20130802
20130803
20130804
20130805
20130806
20130807
20130808
.
.
.
20130819

Da mesma forma, tenho pastas criadas dos últimos dois anos para cada dia e cada uma dessas pastas tem alguns arquivos nela.

Estou tentando encontrar um comando unix que procure por pastas criadas aos sábados e domingos e exclua todo o conteúdo da pasta e da própria pasta.

Por exemplo, nas datas que mencionei acima, as pastas com os nomes 20130803 e 20130804 e o conteúdo dentro dele devem ser excluídas.

    
por Light Yagami 20.08.2013 / 20:14

2 respostas

0

Você pode usar a função de data para identificar os dias do fim de semana:

find . -path "./2013*" -printf "%f\n" | \
awk '{ \
cmd = sprintf( "date -d %s +\"%a\"", $0 ); \
cmd | getline value; close( cmd ); \
if( value ~ /Sat/ || value ~ /Sun/ ) print $0; \
}'

onde tudo isso é, na verdade, em uma linha poderia ir em uma linha. Eu usei o "\" para torná-lo mais legível embora. Você poderia soltar o "\" e criar uma linha a partir do shell.

Isso mostrará os nomes dos diretórios que correspondem a "Sat" ou "Sun" (local específico) da saída de localização. Você poderia usar a saída para criar um script para "rm -r" os diretórios.

Você também pode usar diretamente a formatação de data do find "% Aa" (que é apoiada pela mesma análise de formato strftime da data) se você souber que todas as datas de atualização dos diretórios correspondem aos seus nomes. Eu assumi que não era o caso (porque não é para o meu teste).

Por exemplo, com os diretórios que fiz para testar:

find . -path "./2013*" -printf "%Aa\n"

rendimentos

Tue
Tue
Tue

que não é tão útil.

    
por 20.08.2013 / 20:38
0

Você pode criar um script bash ( a.bash ) para fazer isso:

#!/bin/bash

for i in $(\ls -1d 2013*); 
  do 
     if [ $(date -d "$i" +%a) == "Sun" ] || [ $(date -d "$i" +%a) == "Sat" ]; then 
          echo "$i is weekend. Delete the content";
          rm -rf "$i"/*; 
     fi; 
done

execute ./a.bash

    
por 20.08.2013 / 21:16

Tags