Acrescentar data e hora legível da última edição ao nome do arquivo

5

Eu gostaria de adicionar o horário da última alteração no arquivo ao nome do arquivo usando o bash.

Por exemplo, esta saída de ls -la :

 -rw-rw-r-- 1 beginner beginner 5382 Dec  1 17:18 B_F1-1.xml

deve se tornar

 -rw-rw-r-- 1 beginner beginner 5382 Dec  1 17:18 B_F1-1_20141201T1718.xml

Como eu poderia fazer isso em todos os arquivos em?

    
por Beginner 01.12.2014 / 17:25

3 respostas

4

Você pode tentar algo como:

EXT=${FILE#*.}
NAME=${FILE%%.*}

mv "$FILE" "$NAME$(date --reference "$FILE" '+%Y%m%dT%H%M').$EXT"

em um script, se o seu date suportar --reference , que seleciona a data da última modificação do arquivo de referência.

    
por 01.12.2014 / 17:51
4

Acho que isso pode funcionar:

for i in *; do 
   fileTime=$(stat -c %Y "$i");  #Get last modification (since EPOCH)
   formatDate=$(date +%Y%m%dT%H%m -d @"$fileTime"); #Get time in format YYYYMMDDTHHmm
   mv "${i%%.*}"_"$formatDate"."${i#*.}"; #Appends "formatDate" before extension
done

Cumprimentos.

    
por 01.12.2014 / 17:48
1

Isso tudo pode ser feito como um oneliner.

for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%Y%m%dT%H%M).${i##*.}"; done

Para um literal registro de data e hora , ou seja, segundos desde a época, você pode usar:

for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%s).${i##*.}"; done

Isto tem uma verificação de segurança para operar somente em arquivos cujos nomes contenham pontos; manipula corretamente arquivos com espaços nos nomes; e assume (como normalmente seria o caso) que o campo LAST dot separated é a extensão, em vez de o campo FIRST dot separated ser o nome do arquivo e o restante ser uma extensão.

Crédito para muru para o --reference bit; Eu não sabia sobre essa opção.

    
por 06.11.2015 / 05:25