Не меняется дата создания у файла
Есть файловый сервер на котором выделили шару, на нем необходимо поменять дату создания файла на более позднюю. Например, на 2017 год. Так вот, проблема в том, что эта дата автоматически сбрасывается в текущую дату, хотя дата последнего доступа и дата последний записи успешно меняется. На локальном компьютере, где стоит Windows 7 все успешно меняется, на сервере под Windows 2003 все успешно меняется по шаре, а на сторонней шаре не менятся. Даже пробовал файл 2017 года кидать на шару, так все равно сбрасывалась дата до 2016. Дату пытаюсь менять самопальной программой. Гугл молчит. Подскажите, в чем может быть проблема? Может это какая-то политика безопасности или может быть целевой сервер вообще не под управлением Windows? UPD Дата создания все таки меняется, но только в прошлое. Т.е 2013 год я спокойно могу поставить, а 2017 сбросится до 2016.
1 ответ 1
Согласно стандарту POSIX (а, по всей видимости, сервер обслуживается вариантом OS UNIX), в структуре дескриптора файла должны присутствовать следующие поля, связанные с временем:
struct stat /* структура, возвращаемая stat */ < . . . time_t st_atime; /* время последнего чтения из файла */ time_t st_mtime; /* время последней записи в файл */ time_t st_ctime; /* время последнего изменения файла или индексного дескриптора */ >;
Как видите, никакого времени СОЗДАНИЯ файла здесь нет. И это — совершенно правильно. Что бы в этом убедиться, подумайте вот над каким вопросом: Вы переименовали файл А (может быть — переслали его в другой каталог) именем В. Что есть дата СОЗДАНИЯ файла В? У Вас есть внятный ответ на этот вопрос? Такого ответа никто пока не придумал 🙂 А то, что в Windows называется датой СОЗДАНИЯ файла — оставим это на совести Билла Гейтса 🙂
Массово изменить дату создания файлов
Есть ли какой-то пакетный обработчик файлов, который бы проставил дату создания файла равной дате изменения файла, которая соответствует дате и времени съемки.
–preserve[=ATTR_LIST] preserve the specified attributes (default: mode,ownership,time‐ stamps), if possible additional attributes: context, links, xattr, all
SpaceRanger ★★ ( 11.05.22 23:00:40 MSK )
Последнее исправление: SpaceRanger 11.05.22 23:01:18 MSK (всего исправлений: 1)
Не пойдет, так как файлы уже скопированы, а оригиналы с карт памяти удалены
Да, это называется «скрипт-однострочник на bash».
Тоже в этом направлении думаю
Нужно в каталоге последовательно читать время изменения файла и через touch устанавливать время создания?
Ух ты, первый раз вижу кого-то кто интересуется содержанием какого-либо таймстапма файла кроме даты модификации. Ещё много какой софт, думаю, забивает на atime/ctime/birthtime.
firkax ★★★★ ( 12.05.22 02:17:21 MSK )
Последнее исправление: firkax 12.05.22 02:17:54 MSK (всего исправлений: 1)
digiKam считает, что фото двухлетней давности отсняты вчера. Отсюда и интерес к дате создания
Для пакетного изменения экзифа есть exiftool. Примеры в гугле в изобилии.
Не на всякой файловой системе хранится время создания файла.
Проблема не в EXIF. С ним как раз все нормально.
Вот пример кадра с камеры, скопированного на диск
$ stat ~/Test/IMG_3379.CR2 Файл: /home/max/Test/IMG_3379.CR2 Размер: 24955660 Блоков: 48744 Блок В/В: 4096 обычный файл Устройство: 0/44 Инода: 255026 Ссылки: 1 Доступ: (0644/-rw-r--r--) Uid: ( 1000/ maxim) Gid: ( 1000/ max) Доступ: 2021-09-13 04:00:00.000000000 +0400 Модифицирован: 2019-10-24 20:56:26.000000000 +0400 Изменён: 2022-05-12 22:41:04.006824106 +0400 Создан: 2022-05-12 22:41:04.006824106 +0400
Если я его добавляю в альбом через digiKam, то digiKam считает, что фото снято сегодня, а не в октябре 2019 года
Копирование файлов между разными FS может привести к подобному, к сожалению
Как я могу изменить время создания всех файлов папки на текущее время?
В оболочке Linux, как я могу изменить время создания всех файлов папки на текущее время?
3 ответа 3
Перейдите к рассматриваемой папке, скажем, ~/Documents/myfiles.
Это изменит время модификации, когда вы выполняете эту команду.
Очевидно, вы можете сделать это более конкретным в зависимости от вашего варианта использования, например,
только изменит время модификации для файлов со строкой ‘.doc’ в их имени.
В Linux, если вы хотите сделать что-то рекурсивное в каталоге, или вы хотите применить некоторые действия к файлам, отвечающим некоторым критериям, вам следует попробовать find и xargs
Нажмите на все файлы в ~/Documents/myfiles (включая файлы в подкаталоге)
find ~/Documents/myfiles -type f -print0 | xargs -0 touch
ОП запросил время создания, но ответы Яна Янга и Боэджа основаны на touch команды, устанавливающей время модификации, доступа и изменения текущего времени.
Как boehj сказал (в комментарии) нет времени создания файла . Это верно для большинства файловых систем, но в некоторых современных файловых системах (например, ext4) время создания (или рождения) файла хранится в inode.
Поэтому мы можем дать более правильный ответ, скрупулезно соблюдая заголовок вопроса:
cp -a your-folder tmp-folder rm -rf your-folder mv tmp-folder your-folder
Это изменит время создания (время рождения ) на текущее время. Это также обновляет время изменения, но сохраняет неизменным время изменения и доступа .
Для информации время изменения иногда сокращается как ctime и может быть перепутано со временем создания ( crtime или btime ). Фактически время изменения файла — это время изменения его соответствующего inode. Поэтому команды, изменяющие содержимое inode как chmod или chattr также устанавливают время изменения на текущее время.
How can I change ‘change’ date of file?
You cannot change the ctime by ordinary means. This is by design: the ctime is always updated to the current when you change any of the file’s metadata, and there is no way to impose a different ctime. To change the ctime of a file, you need to do one of the following:
- Set the system time to the ctime you want to impose, then touch the file, then reset the system time.
- Modify the kernel to add an interface to change the ctime.
- Access the disk image directly (e.g. with debugfs ) and twiddle the bits on the disk (don’t do it while the filesystem is mounted).
You have the answer on related SO question pointed by jw013, for extX, on unmounted disk :
# Update ctime debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1 # Drop vm cache so ctime update is reflected echo 2 > /proc/sys/vm/drop_caches
$ NOW=$(date) && date -s «2030-08-15 21:30:11» && touch file.txt && date -s «$NOW»
The ctime of a file is updated when any of the metadata is changed.
$ ls -l x.py -rw-rw-r--. 1 ignacio ignacio 485 Mar 26 2010 x.py $ stat -c %z x.py 2010-03-26 11:57:56.237068175 -0400 $ chown ignacio x.py $ stat -c %z x.py 2012-04-08 15:31:33.682383575 -0400 $ ls -l x.py -rw-rw-r--. 1 ignacio ignacio 485 Mar 26 2010 x.py
evandrix’s answer excerpted in the next line,
NOW=$(date) && date -s «2030-08-15 21:30:11» && touch file.txt && date -s «$NOW»
needs to be improved as described below :
In some systems like mine, date output doesn’t give a valid format to set with date -s
My system bash shell version : GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
My system date command version : date (GNU coreutils) 8.30
My system date command output and setting the date with this format is:
# date Tue 21 Jan 2020 01:36:22 PM +03 # date -s "Tue 21 Jan 2020 01:36:22 PM +03" date: invalid date ‘Tue 21 Jan 2020 01:36:22 PM +03’
So it is necessary to improve evandrix answer;
It would be better to assign the NOW variable to the timestamp value
change NOW=$(date) to NOW=$(date +@%s)
NOW=$(date +@%s) && date -s "2030-08-15 21:30:11" && \ touch file.txt && date -s "$NOW"
Adding sudo command for non root user
sudo bash -c 'NOW=$(date +@%s); date -s "2030-08-15 21:30:11"; touch file.txt; date -s "$NOW"'
sudo bash -c 'NOW=$(date +@%s); date -s "$2"; touch "$1"; date -s "$NOW"' -- \ "file.txt" "2030-08-15 21:30:11"
In this way for easy use, the filename and setting date are assigned as arguments at the end of the line.