Согласно странице руководства 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
в нескольких транзакциях, дав системе время на уведомление?
Вы можете использовать команду stat
, чтобы получить время создания файла.
CREATION_TIME=`debugfs -R 'stat /path/to/file' /dev/sdaX | awk -F '-' '/crtime/{print $NF}'`
И вы можете изменить дату изменения с помощью команды touch
.
touch -d "$CREATION_TIME" file
Вот сценарий, который сделает это за вас, он строго использует предоставленный вами формат имени файла. Предполагая, что все файлы начинаются с даты и времени, и эта задержка составляет всего 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