Jak mogę zmienić datę modyfikacji / utworzenia pliku?

233

Czy istnieje sposób na zmianę daty modyfikacji / utworzenia pliku (który jest pokazany w Nautilus lub za pomocą polecenia ls -l)? Idealnie szukam polecenia, które może zmienić znaczniki daty / godziny całej wiązki plików na określony czas wcześniej lub później (np. +8 godzin lub -4 dni itp.).

snej
źródło

Odpowiedzi:

322

Tak długo, jak jesteś właścicielem pliku (lub użytkownika root), możesz zmienić czas modyfikacji pliku za pomocą touchpolecenia:

touch filename

Domyślnie ustawi to czas modyfikacji pliku na bieżący czas, ale istnieje wiele flag, takich jak -dflaga, aby wybrać konkretną datę. Na przykład, aby ustawić plik jako zmodyfikowany na dwie godziny przed teraźniejszością, możesz użyć:

touch -d "2 hours ago" filename

Jeśli zamiast tego chcesz zmodyfikować plik w stosunku do jego istniejącego czasu modyfikacji, wykonaj następujące czynności:

touch -d "$(date -R -r filename) - 2 hours" filename

Jeśli chcesz zmodyfikować dużą liczbę plików, możesz użyć następujących opcji:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

Możesz zmienić argumenty, aby findwybrać tylko te pliki, które Cię interesują. Jeśli chcesz tylko zaktualizować czasy modyfikacji plików w stosunku do chwili obecnej, możesz to uprościć, aby:

find DIRECTORY -exec touch -d "2 hours ago" {} +

Ten formularz nie jest możliwy w przypadku wersji zależnej od czasu pliku, ponieważ używa powłoki do formowania argumentów touch.

Jeśli chodzi o czas tworzenia, większość systemów plików Linux nie śledzi tej wartości. Jest ctimepowiązany z plikami, ale śledzi, kiedy metadane pliku zostały ostatnio zmienione. Jeśli uprawnienia do pliku nigdy się nie zmieniają, może się zdarzyć, że zatrzyma czas utworzenia, ale to przypadek. Jawna zmiana czasu modyfikacji pliku jest liczona jako zmiana metadanych, więc będzie również miało efekt uboczny aktualizacji ctime.

James Henstridge
źródło
Aby wspomnieć o prostszym przypadku, gdy wszystkie pliki znajdują się w tym samym folderze: touch -d "2 hours ago" /path/*.txtna przykład.
enzotib
1
Dodałbym również, że zmiana ctimenie jest możliwa w żaden standardowy sposób.
umów się
Czy to wszystko POSIX?
user1011471
1
Informacje o ctimeczasie zmiany metadanych pochodzą z POSIX. Nie wiem, czy fragmenty powłoki w mojej odpowiedzi działałyby ze ścisłymi narzędziami powłoki POSIX. Ale zdecydowanie działają na Ubuntu, który jest kontekstem dla odpowiedzi na tej stronie.
James Henstridge
1
W OSX możesz chcieć używać gtouchza pośrednictwem brew install coreutils.
Nobu
46

Dzięki za pomoc. To działało dla mnie:

W terminalu przejdź do katalogu do edycji daty. Następnie wpisz:

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

Zobaczysz „>” po wciśnięciu Enter, z wyjątkiem ostatniego -> „gotowe”.

Uwaga: możesz zmienić „201203101513”

„201203101513” = to data, dla której chcesz mieć wszystkie pliki w tym katalogu.

Zobacz moją stronę

EFL
źródło
nie działa zgodnie z oczekiwaniami, jeśli nazwa pliku zawiera puste spacje
Angel
Strona internetowa już nie istnieje, ale jest 6 lat później. Niemniej jednak to była odpowiedź, której szukałem. Dla tych, którzy chcą uwzględnić sekundy w swoim czasie, użyj .ssgdzie ss jest liczbą sekund. (Uwaga: nie wydaje się, aby kontrolowało taktowanie sekundowe, takie jak nanosekundy lub milisekundy, które dla mnie wyglądały jak zera; jednak ta różnica była dopuszczalna w moim przypadku użycia).
Spencer D
34

Najłatwiejszy sposób - dostęp i modyfikacja będą takie same:

touch -a -m -t 201512180130.09 fileName.ext

Gdzie:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Jeśli chcesz użyć, NOWpo prostu upuść -tznacznik czasu i.

Aby sprawdzić, czy wszystkie są takie same: stat fileName.ext

Zobacz: dotknij człowieka

Jadeje
źródło
1
Próbowałem to zweryfikować za pomocą statystyki, ale żadna z touchflag nie doprowadziła do poprawnego wyniku. Data modyfikacji jest dostosowana, ale data zmiany i dostępu została zmieniona na TERAZ
Xerus
Nie działało to dla mnie, zmieniło tylko czas „Zmień”
Revious
@Revious, Xerus Jaka jest różnica między changedczasem a modifiedznacznikami czasu?
ijoseph
9

Dotyk może sam odwoływać się do daty pliku, nie trzeba dzwonić dateani zastępować poleceń. Oto trochę ze strony informacyjnej dotyku:

`-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.

Na przykład, aby dodać 8 godzin do daty pliku (nazwa filecudzysłowu tylko w przypadku spacji itp.):

touch -r "file" -d '+8 hour' "file"

Używając pętli do wszystkich plików w bieżącym katalogu:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

Słyszałem, że używanie a *i forwybieranie samych nazw plików jest bezpieczniejsze , ale używanie find -print0 | xargs -0 touch ... powinno obsługiwać większość szalonych znaków, takich jak znaki nowej linii, spacje, cytaty, ukośniki odwrotne w nazwie pliku. (PS. Przede wszystkim staraj się nie używać zwariowanych postaci w nazwach plików).

Na przykład, aby znaleźć wszystkie pliki, w thatdirktórych nazwy plików rozpoczynają się od s, i dodać jeden dzień do zmodyfikowanego znacznika czasu tych plików, użyj:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Xen2050
źródło
2

Ten mały skrypt przynajmniej dla mnie działa

#!/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
joakim
źródło
2
Dostosowanie daty obrazów na podstawie meta informacji na obrazie byłoby bardzo przydatne. Można użyć identyfikacji ImageMagick. np. „ident -verbose <image> | grep -i date”, „ident--format% [exif: DateTime] <image>” może pokazywać „2015: 01: 08 10:19:10” (nie wszystkie obrazy zawierają dane exif ). Działa to (użycie sed do konwersji daty na formatowanie może obsługiwać): 'touch -d $ (ident -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
1

Minęło dużo czasu, odkąd napisałem jakiś program uniksowy, ale przypadkowo ustawiłem rok niepoprawnie na kilku zdjęciach świątecznych i wiedziałem, że jeśli nie zmienię daty z 2015 na 2014, to będzie problem później .

Być może jest to łatwe zadanie, ale nie znalazłem żadnego prostego sposobu, aby to zrobić.

Zmodyfikowałem znaleziony tutaj skrypt, który pierwotnie wykorzystano do modyfikacji daty o minus jeden miesiąc.

Oto oryginalny skrypt:

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

Oto mój zmodyfikowany skrypt, który wymusił datę na rok „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

Teraz zdaję sobie sprawę, że mogłem zrobić bardziej ogólną wersję:

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

Aby użyć tego pliku, musisz go napisać i

chmod +x fn

wykonać:

./fn files-to-change

fn = twoja-nazwa-pliku-to-to-twoje-polecenie

Przykład

./fn *.JPG

zmieni datę o minus jeden rok w katalogu, w którym jesteś.

RickK
źródło
1
Taki sam jak powyższy komentarz. Większość plików .jpg będzie miała datę osadzoną w metadanych dodawanych przez aparat. Działa to (użycie sed do konwersji daty na formatowanie może obsługiwać): 'touch -d $ (ident -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
-6

wystarczy zmienić datę i godzinę w ustawieniach. następnie zapisz plik, zmieni się on automatycznie

vampiremac
źródło
3
Snej szuka rozwiązania wsadowego lub wiersza poleceń, które można wykorzystać do modyfikacji wielu plików. Zmiana godziny i daty systemowej oraz modyfikacja plików prawdopodobnie nie jest idealnym rozwiązaniem.
fabricator4,
za dużo triiiiiiicky !!!
Philippe Gachoud,
Dla osób z innymi systemami operacyjnymi wprowadzonymi tutaj przez wyszukiwanie w sieci, ta odpowiedź jest najprostszym sposobem zmiany daty pliku w Mac OSX („touch-d” powoduje „nielegalną opcję”).
alanning
1
@alanning: OSX ma BSD touch, a nie GNU touch. Użyj T. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R
Może to mieć nieprzewidziane konsekwencje. W nowoczesnym systemie operacyjnym wiele plików jest cały czas modyfikowanych. Chociaż data zostanie zmieniona, wiele innych plików może mieć nieprawidłowe znaczniki daty i wszystko może się zdarzyć, gdy coś innego w systemie zauważy, że plik jest starszy niż oczekiwano.
Joe