Відповіді:
Поки ви є власником файла (або root), ви можете змінити час модифікації файлу за допомогою touch
команди:
touch filename
За замовчуванням це встановить час модифікації файлу на поточний час, але є ряд прапорів, наприклад -d
прапор для вибору конкретної дати. Так, наприклад, щоб встановити файл як модифікований за дві години до теперішнього, ви можете використовувати наступне:
touch -d "2 hours ago" filename
Якщо ви хочете змінити файл відносно його існуючого часу модифікації, замість цього слід виконати наступне:
touch -d "$(date -R -r filename) - 2 hours" filename
Якщо ви хочете змінити велику кількість файлів, ви можете використовувати наступне:
find DIRECTORY -print | while read filename; do
# do whatever you want with the file
touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done
Ви можете змінити аргументи, щоб find
вибрати лише ті файли, які вас цікавлять. Якщо ви хочете лише оновити час модифікації файлу відносно поточного часу, ви можете спростити це до:
find DIRECTORY -exec touch -d "2 hours ago" {} +
Ця форма неможлива при відносній версії файлу, оскільки вона використовує оболонку для формування аргументів touch
.
Що стосується часу створення, більшість файлових систем Linux не відстежують це значення. З ctime
файлами пов'язано, але він відслідковує, коли метадані файлу востаннє були змінені. Якщо файл ніколи не змінює свої дозволи, можливо, він затримає час створення, але це збіг обставин. Явна зміна часу модифікації файлу вважається зміною метаданих, тому також буде побічний ефект від оновлення ctime
.
ctime
неможливо в будь-який стандартний спосіб.
ctime
час зміни метаданих надходить з POSIX. Я не знаю, чи працювали б фрагменти оболонки у моїй відповіді із суворими утилітами оболонки POSIX. Але вони безумовно працюють над Ubuntu, що є контекстом для відповідей на цьому сайті.
gtouch
через brew install coreutils
.
Дякую за допомогу. Це працювало для мене:
У терміналі перейдіть до каталогу для редагування дат. Потім введіть:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
Після натискання клавіші "Enter" ви побачите ">", виконайте останній раз -> "зроблено".
Примітка. Ви можете змінити "201203101513"
"201203101513" = дата, яку ви бажаєте, для всіх файлів у цьому каталозі.
.ss
де ss - кількість секунд. (Примітка: це, здається, не контролює підсекундні таймінги, такі як наносекунди або мілісекунди, які для мене просто видаються нулями; однак ця різниця була допустимою для мого використання.)
Найпростіший спосіб - доступ і зміна буде однаковим:
touch -a -m -t 201512180130.09 fileName.ext
Де:
-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
Якщо ви хочете скористатися, NOW
просто опустіть -t
та позначку часу.
Щоб перевірити, чи всі вони однакові:
stat fileName.ext
Дивіться: торкніться людини
touch
прапорів не призводить до правильного результату. Дата зміни коригується, але змінена і дата доступу фактично змінена на ЗАРАЗ
changed
часом та часовими modified
позначками?
Touch може позначати дату файлу сама по собі, не потрібно телефонувати date
або використовувати підстановку команд. Ось трохи з інформаційної сторінки дотику:
`-r FILE' `--reference=FILE'
Use the times of the reference FILE instead of the current time.
If this option is combined with the `--date=TIME' (`-d TIME')
option, the reference FILE's time is the origin for any relative
TIMEs given, but is otherwise ignored. For example, `-r foo -d
'-5 seconds'' specifies a time stamp equal to five seconds before
the corresponding time stamp for `foo'. If FILE is a symbolic
link, the reference timestamp is taken from the target of the
symlink, unless `-h' was also in effect.
Наприклад, додати 8 годин до дати файлу (назва файлу, file
котирується лише у випадку пробілів тощо):
touch -r "file" -d '+8 hour' "file"
Використання циклу для всіх файлів у поточному режимі:
for i in *; do touch -r "$i" -d '+8 hour' "$i"; done
Я чув, що використання *
і дозволяти for
вибирати імена файлів само по собі є більш безпечним , але використовувати find -print0 | xargs -0 touch ...
слід обробляти більшість божевільних символів, таких як нові рядки, пробіли, лапки, косої риски у назві файлу. (PS. Спробуйте в першу чергу не використовувати божевільні символи у назви файлів).
Наприклад, щоб знайти всі файли, у thatdir
назві файлів яких починається з s
, і додати один день до зміненої часової позначки цього файлу, використовуйте:
find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Цей маленький сценарій принаймні працює для мене
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
Давно я написав будь-яку програму Unix, але випадково я неправильно встановив рік на купі різдвяних фотографій, і я знав, що якщо я не зміню дату з 2015 на 2014, це буде проблемою пізніше .
Можливо, це легке завдання, але я не знайшов простого способу це зробити.
Я змінив знайдений тут скрипт, який спочатку використовувався для зміни дати мінус один місяць.
Ось оригінальний сценарій:
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
Ось мій модифікований сценарій, який змусив дату року "2014":
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v +1y -r $(stat -f %m "${f}") +2014%m%d%H%M.%S) "${f}"
done
Тепер я розумію, що міг би зробити більш загальну версію:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch (+1y adds a year "-1y" subtracts a year)
# Below line subtracts a year
touch -t $(date -v -1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
# Below line adds a year
# touch -t $(date -v +1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
Щоб використовувати цей файл, вам потрібно його написати та
chmod +x fn
виконати:
./fn files-to-change
fn = your-file-name-that-is-your-command
Приклад
./fn *.JPG
змінить дату на мінус один рік у каталозі, де ви знаходитесь.
просто змініть дату та час у налаштуваннях. потім збережіть файл, він автоматично змінюється
touch -d "2 hours ago" /path/*.txt
наприклад.