renomear arquivos adicionando o mês e o ano definidos nos registros de data e hora do arquivo

2

Eu tenho o script abaixo salvo no diretório MYFILES para criar um número x de arquivos & seus timestamps foram executados aleatoriamente com vários anos & meses.

for i in {1938..2037}; do   
    ## create a file with a random month
    touch -d "${i}-$((RANDOM % 12 + 1))-01" file_$((i-1937))
    done  
output:
-rw-r--r-- Users   0 Jul  1  1938 file_1
-rw-r--r-- Users   0 Jun  1  1947 file_10
-rw-r--r-- Users   0 Oct  1  2037 file_100 

Por gentileza, ajude como criar um script que analise o conteúdo do diretório MYFILES e classifique os arquivos no subdir FILES2, depois renomeie os arquivos de acordo com seus timestamps.

A saída da amostra deve ser:

rw-r--r-- Users   0 Jul  1  1938 file_JUL1938
rw-r--r-- Users   0 Jun  1  1947 file_JUN1947
rw-r--r-- Users   0 Oct  1  2037 file_OCT2037
    
por trixie101 22.09.2017 / 18:37

2 respostas

0
ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'

Para a renomeação real de arquivos, a palavra echo deve ser removida.

Explicação

  1. ls -l file_* | awk - lista todos os arquivos e envia-os para o awk .
  2. system() - executa o comando shell.
  3. mv -v -- " $9 " file_" toupper($6) $8 -
    • mv - o comando usual mv executado no shell.
    • toupper(str) - retorna uma cópia da string str , com todos os caracteres minúsculos em str traduzidos para as contrapartes maiúsculas correspondentes.
    • $6 - mês: ago, jul, fev.
    • $8 - ano: 1938, 1947, 2037.
    • $9 - nome do arquivo: arquivo_1, arquivo_10, arquivo_100.

Arquivos

$ ls -l file_*
-rw-rw-r-- 1 user user 0 Aug  1  1938 file_1
-rw-rw-r-- 1 user user 0 Jul  1  1947 file_10
-rw-rw-r-- 1 user user 0 Feb  1  2037 file_100

Resultado

mv -v -- file_1 file_AUG1938
mv -v -- file_10 file_JUL1947
mv -v -- file_100 file_FEB2037
    
por 23.09.2017 / 00:23
3

Use data e estatísticas do GNU para coletar e reverter as informações:

for f in *
do
  ref=$(stat -c %y "$f" | awk '{print $1}')
  mon=$(date -d "$ref" +%b)
  year=$(date -d "$ref" +%Y)
  echo mv -- "$f" "file_${mon^^}${year}"
done

Isto usa um bashismo para maiúsculas no mês; se isso não estiver disponível, use echo "$mon" | tr '[:lower:]' '[:upper:]' . Outra alternativa, graças ao steeldriver, é usar a funcionalidade de data recente para retornar a versão em maiúsculas do mês: date +%^b .

Para criar os arquivos de amostra:

touch -d 1938-07-01 file_1
touch -d 1947-06-01 file_10
touch -d 2037-10-01 file_100

Ouput do script na entrada de amostra:

mv -- file_1 file_JUL1938
mv -- file_10 file_JUN1947
mv -- file_100 file_OCT2037
    
por 22.09.2017 / 18:50