Исправление имен файлов с меткой времени с правильной датой создания [закрыто]

Согласно странице руководства zfs (FreeBSD 11-STABLE от 09 марта 2017 г.),

Enforcement of user quotas may be delayed by several seconds. This
delay means that a user might exceed their quota before the system
notices that they are over quota and begins to refuse additional
writes with the EDQUOT error message.

возможно, что ваши тесты выявляют это поведение. Что произойдет, если вы попытаетесь превысить значение userquota в нескольких транзакциях, дав системе время на уведомление?

1
28.06.2018, 20:44
2 ответа

Вы можете использовать команду stat, чтобы получить время создания файла.

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

И вы можете изменить дату изменения с помощью команды touch.

touch -d "$CREATION_TIME" file
0
28.01.2020, 00:33

Вот сценарий, который сделает это за вас, он строго использует предоставленный вами формат имени файла. Предполагая, что все файлы начинаются с даты и времени, и эта задержка составляет всего 1 час, которую необходимо исправить. Он использует время эпохи, чтобы вычесть 1 час из времени в имени файла и переименовать файлы.

Измените каталог в сценарии на ваш локальный.

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

РЕДАКТИРОВАТЬ :Вот скрипт, сравнивающий дату рождения перед переименованием. (На всякий случай сделайте резервную копию)

#!/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
0
28.01.2020, 00:33

Теги

Похожие вопросы