Як я можу змінити дату, змінену / створену для файлу?


233

Чи є спосіб змінити дату, коли файл було змінено / створено (що відображається в Nautilus або за допомогою команди ls -l)? В ідеалі я шукаю команду, яка може змінити позначки дати / часу цілого ряду файлів на певний час раніше або пізніше (наприклад, +8 годин або -4 дні тощо).

Відповіді:


322

Поки ви є власником файла (або 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.


Зазначимо простіший випадок, коли всі файли знаходяться в одній папці: touch -d "2 hours ago" /path/*.txtнаприклад.
enzotib

1
Я також додам, що змінити ctimeнеможливо в будь-який стандартний спосіб.
влаштовуйте

Це все POSIX?
користувач1011471

1
Інформація про ctimeчас зміни метаданих надходить з POSIX. Я не знаю, чи працювали б фрагменти оболонки у моїй відповіді із суворими утилітами оболонки POSIX. Але вони безумовно працюють над Ubuntu, що є контекстом для відповідей на цьому сайті.
Джеймс Генстридж

1
На OSX ви можете використовувати gtouchчерез brew install coreutils.
Нобу

46

Дякую за допомогу. Це працювало для мене:

У терміналі перейдіть до каталогу для редагування дат. Потім введіть:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Після натискання клавіші "Enter" ви побачите ">", виконайте останній раз -> "зроблено".

Примітка. Ви можете змінити "201203101513"

"201203101513" = дата, яку ви бажаєте, для всіх файлів у цьому каталозі.

Дивіться мою веб-сторінку


він не працює, як очікувалося, якщо ім'я файлу містить порожні пробіли
Angel

Веб-сторінки більше немає, хоча це ще через 6 років. Тим не менш, це відповідь, яку я шукав. Для тих, хто хоче включити секунди у свій час, використовуйте .ssде ss - кількість секунд. (Примітка: це, здається, не контролює підсекундні таймінги, такі як наносекунди або мілісекунди, які для мене просто видаються нулями; однак ця різниця була допустимою для мого використання.)
Спенсер D

34

Найпростіший спосіб - доступ і зміна буде однаковим:

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

Дивіться: торкніться людини


1
Я намагався перевірити це за допомогою stat, але жоден з touchпрапорів не призводить до правильного результату. Дата зміни коригується, але змінена і дата доступу фактично змінена на ЗАРАЗ
Xerus

Мені це не вийшло, він змінив лише час "Зміни"
Revious

@Revious, Xerus У чому різниця між changedчасом та часовими modifiedпозначками?
ійосеф

9

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' '{}'

2

Цей маленький сценарій принаймні працює для мене

#!/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

2
Налаштування дати зображення на основі метаінформації на зображенні було б дуже корисним. Ідентифікатор ImageMagick може бути використаний. наприклад, "ідентифікувати -вербоза <зображення> | grep -i дата", "ідентифікувати -формат% [exif: DateTime] <image>" може відображатися "2015: 01: 08 10:19:10" (не всі зображення мають exif дані ). Це працює (за допомогою sed для перетворення дати у формат touch touch може обробити): 'touch -d $ (ідентифікуйте -формат% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe

1

Давно я написав будь-яку програму 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

змінить дату на мінус один рік у каталозі, де ви знаходитесь.


1
Те саме, що вище коментар. У більшості файлів .jpg дата вбудована в метадані, що додаються камерою. Це працює (за допомогою sed для перетворення дати у формат touch touch може обробити): 'touch -d $ (ідентифікуйте -формат% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe

-6

просто змініть дату та час у налаштуваннях. потім збережіть файл, він автоматично змінюється


3
Snej шукає рішення для пакетного чи командного рядка, яке можна використовувати для зміни декількох файлів. Зміна системного часу та дати та модифікація файлів, мабуть, не є ідеальним рішенням.
fabrator4

занадто багато triiiiiiicky !!!
Філіп Гачуд

Для тих, хто має інших ОС, занесених сюди за допомогою веб-пошуку, ця відповідь є найпростішим способом зміни дати дати файлу на Mac OSX ("touch -d" призводить до "незаконної опції").
аланування

1
@alanning: OSX має BSD touch, а не GNU touch. Використовувати -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Домінік R

Це може мати непередбачені наслідки. У сучасній ОС багато файлів постійно змінюються поза кадром. Незважаючи на зміну вашої дати, багато інших файлів можуть отримати неправильні відбитки дати, і все може статися, коли щось інше в системі помітить, що файл старіший, ніж очікувалося.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.