Como aumentar os carimbos de data / hora do arquivo em 3 meses (para uma árvore de diretórios)?

3

Estou vendo o utilitário de linha de comando touch (no Linux) e, a partir dos exemplos que encontrei em tutoriais , Vejo como é possível aumentar o registro de data e hora de acesso ou modificação para um horário especificado, a hora atual ou um arquivo de referência.

No entanto, gostaria de fazer o seguinte: A idade relativa dos meus arquivos (um em relação ao outro) tem informações valiosas para mim, e prefiro não perder isso. Mas preciso que cada arquivo em pastas (recursivas) pareça alguns meses mais novo do que elas. Assim, cada arquivo poderia se referir a si mesmo, aumentar o tempo, mas aplicá-lo a cada arquivo em uma árvore de pastas. O que é uma boa maneira de fazer isso?

#!/bin/bash
FILES=$(find $HIGHEST_FOLDER -type f -name *.*)
for f in $FILES
do
  touch -ram f -F 7776000 f
  # bumping access and modification timestamps by 3 months?
done

Ou é melhor usar find -exec como sugerido em esta resposta? (Existem muitos arquivos nessas pastas.) Como isso funcionaria?

    
por László 30.01.2015 / 15:01

3 respostas

2

Assumindo que você esteja em um sistema Linux, ou pelo menos que você tenha o GNU touch e o GNU date , você pode fazer (no bash; zsh é o mesmo, mas não precisa do shopt globstar ):

$ shopt globstar
$ for f in **; do 
    touch -d "$(date -d "$(stat -c '%y' "$f") +3 months")" "$f"
  done

Isso, no entanto, irá ignorar arquivos ocultos. Para corresponder a esses também, execute shopt -s dotglob antes dos comandos acima.

Explicação

  • shopt -s globstar : Isso define a opção globstar do bash, o que significa que ** corresponderá a todos os arquivos e zero ou mais diretórios e subdiretórios.
  • shopt -s dotglob : faz com que * (e ** ) também correspondam aos arquivos cujos nomes começam com . .
  • for f in **; do ...; done : iterar todos os arquivos e diretórios , salvando-os como $f .
  • stat -c '%y' "$f" : esta é a hora atual do arquivo ou diretório atual.
  • date -d $(...) +3 months : imprime a data que é três meses após a string dada (neste caso, essa string é a saída do comando stat em $f ).

Todos juntos, os itens acima encontrarão a data de modificação de cada arquivo ou diretório na pasta atual (incluindo todos os subdiretórios) e definirão sua data três meses depois do que for agora.

    
por 30.01.2015 / 15:55
1

A partir da descrição do problema, acredito que você esteja procurando a ferramenta que pode obter a hora da última modificação do arquivo e, em seguida, adicione 3 meses a ela. Você pode fazer isso com stat + touch + alguma avaliação aritmética de shell. Por exemplo, para adicionar 90 dias a file timestamp, você pode escrever

touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file

Em seguida, faça o loop de todos os file s necessários.

    
por 30.01.2015 / 15:36
1

Eu usaria o -exec de find - um oneliner.

find $HIGHEST_FOLDER -type f -name '*.*' -exec touch -d "$(date -d "$(stat -c '%y' {}) +3 months")" {} \;

Cite *.* , caso contrário find obterá nomes de arquivos do diretório atual e falhará.

Finalmente, você DEVE especificar \; , barra invertida seguida de ponto-e-vírgula, -exec manda isso. o {} é o arquivo atual find encontrado.

Não há -F alternando para o GNU touch, então seu exemplo não funciona. Existem também vários problemas de sintaxe:

No seu loop for acima, você precisa alterar f para $ f:

touch [...] $f

Caso contrário, ele procurará um arquivo chamado f no diretório atual e alterará sua data x vezes, em que x é o número de arquivos em $HIGHEST_FOLDER .

Se você mantiver o sub shell ( $(...) antes do seu loop), você deve certificar-se de que $HIGHEST_FOLDER esteja definido no sub shell.

    
por 30.01.2015 / 15:33