Correção de nomes de arquivo do registro de data e hora com data de criação correta [fechada]

1

Eu tenho um monte de arquivos de imagem poupados em pastas diferentes com um timestamp falso no nome do arquivo (atraso de 1 hora) e eu quero corrigir isso de acordo com o creation time .

Agora estou tentando escrever um **shell script** que pode passar por todas as pastas > extraia o tempo de criação e substitua-o no registro de data e hora do nome do arquivo, abaixo de um pequeno exemplo:

Nome do arquivo original com timestamp falso:
Nome do arquivo , Data de criação , Data de modificação 20180524010500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

A saída seria:
Nome do arquivo , Data de criação , Data de modificação 20180524000500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

Alguém pode me dizer se isso é possível com um script de shell? Então, alguém pode me dar alguma orientação sobre como usar o comando ls ou qualquer outro comando que possa fazer o trabalho?

Eu comecei a me documentar sobre o uso do comando ls , mas ainda não consigo descobrir como posso extrair o tempo de criação e substituí-lo no registro de data e hora do nome do arquivo, também não sei como script executado através de todas as pastas e sub-pastas contendo os arquivos de imagem,

    
por Yacine Walid 25.06.2018 / 13:51

2 respostas

0

Você pode usar o comando stat para obter o tempo de criação do arquivo.

CREATION_TIME='debugfs -R 'stat /path/to/file' /dev/sdaX | awk -F '-' '/crtime/{print $NF}''

E você pode alterar a data modificada com o comando touch .

touch -d "$CREATION_TIME" file
    
por 25.06.2018 / 16:23
0

Aqui está um script que fará isso para você. Ele usa estritamente o formato de nome de arquivo que você forneceu. Assumindo que todos os arquivos começam com o primeiro dia e que apenas 1 hora de atraso precisa ser corrigido. Está usando o tempo de época para subtrair 1 hora do tempo no nome do arquivo e renomear os arquivos.

Altere o diretório no script para o seu local.

looper.sh

    #!/bin/bash

    echo "Sending directory to the past."

    for path in /path/to/directory/*.jpg; do
      filename=${path##*/}
      #Convert to date format
      oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
      #Get the epoch date
      epochDate=$(date -d "$oldDate" +%s)
      #Subtract 1 hour
      epochDate=$(( $epochDate - 60*60 ))
      #Converting and formating the new date
      newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
      #New filename
      newFilename=$(dirname $path)/$newDate"${filename:14}"
      #Renaming the file
      mv $path $newFilename
    done

EDITAR: Aqui está um script que compara a data de nascimento antes de renomear. (Certifique-se de fazer backup apenas no caso)

#!/bin/bash

echo "Sending directory to the past."

for path in /path/to/directory/*.jpg; do
  filename=${path##*/}
  #Convert to date format
  oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
  #Get the epoch date
  epochDate=$(date -d "$oldDate" +%s)
  #Birth date - Only works if your filesystem supports it.
  birthDate=$(stat $path | grep 'Birth:' | sed 's/\..*//' | awk '{print $2" "$3}')
  epochBirthDate=$(date -d "$birthDate" +%s)
  if [ $epochDate != $epochBirthDate ]; then
    #Subtract 1 hour
    epochDate=$(( $epochDate - 60*60 ))
    #Converting and formating the new date
    newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
    #New filename
    newFilename=$(dirname $path)/$newDate"${filename:14}"
    #Renaming the file
    mv $path $newFilename
  fi
done
    
por 26.06.2018 / 12:22