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

196

Czy istnieje sposób na zmianę daty modyfikacji / utworzenia pliku (co pokazuje Nautilus lub komenda ls -l)? Idealnie szukam polecenia, które może zmienić znaczniki daty / czasu całego zbioru plików na określony czas wcześniej lub później (na przykład +8 godzin lub -4 dni itd.).

    
zadawane snej 22.09.2011, 07:32
źródło

7 odpowiedzi

263

Możesz zmienić czas modyfikacji pliku, używając polecenia touch :

touch filename

Domyślnie ustawi to czas modyfikacji pliku na bieżący czas, ale istnieje pewna liczba flag, na przykład flaga -d do wybrania konkretnej daty. Aby na przykład ustawić plik jako zmodyfikowany na dwie godziny przed datą obecną, można użyć następującego:

touch -d "2 hours ago" filename

Jeśli chcesz zmodyfikować plik w stosunku do jego obecnego czasu modyfikacji, następujące rzeczy powinny załatwić sprawę:

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

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

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 na find , aby wybrać tylko te pliki, które Cię interesują. Jeśli chcesz tylko zaktualizować czas modyfikacji pliku względem aktualnej godziny, możesz uprościć to do:

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

Ten formularz nie jest możliwy w przypadku wersji względnej czasu pliku, ponieważ używa powłoki, aby utworzyć argumenty dla touch .

Jeśli chodzi o czas tworzenia, większość systemów plików Linuksa nie śledzi tej wartości. Istnieje ctime skojarzony z plikami, ale śledzi on, kiedy metadane pliku zostały ostatnio zmienione. Jeśli plik nigdy nie ma zmienionych uprawnień, może się zdarzyć, że utrzyma się czas utworzenia, ale jest to zbieg okoliczności. Jawna zmiana czasu modyfikacji pliku jest liczona jako zmiana metadanych, dlatego też będzie to miało skutek uboczny aktualizacji ctime .

    
odpowiedział James Henstridge 22.09.2011, 08:34
źródło
40

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

W terminalu przejdź do katalogu 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 naciśnięciu Enter, exept po raz ostatni - > "gotowe".

Uwaga:  Możesz zmienić "201203101513"

"201203101513" = jest datą, której chcesz użyć dla wszystkich plików w tym katalogu.

Zobacz moją stronę

    
odpowiedział EFL 10.03.2012, 15:21
źródło
22

Najprostszy 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ć NOW , po prostu upuść -t i znacznik czasu.

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

Zobacz: dotknij mężczyzny

    
odpowiedział Jadeye 19.12.2015, 15:58
źródło
7

Dotyk może sam odwoływać się do daty pliku, nie trzeba wywoływać date ani używać podstawiania poleceń. Oto trochę informacji ze strony 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 pliku file podana właśnie w przypadku spacji, itp.):

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

Używanie pętli dla 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 * i pozwalanie for wybrać same nazwy plików jest bezpieczniejsze , ale użycie find -print0 | xargs -0 touch ... powinno obsłużyć większość zwariowanych znaków, takich jak znaki nowej linii, spacje, cudzysłowy, ukośniki w nazwie pliku. (PS, spróbuj nie używać zwariowanych znaków w nazwach plików).

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

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
odpowiedział Xen2050 17.12.2016, 15:52
ź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
    
odpowiedział joakim 06.08.2013, 21:40
źródło
1

Minęło sporo czasu, odkąd napisałem jakiś program uniksowy, ale przez przypadek niepoprawnie ustawiłem rok na kilka świątecznych zdjęć i wiedziałem, że jeśli nie zmienię daty z 2015 na 2014, to problem później.

Może to łatwe zadanie, ale nie znalazłem prostego sposobu na to.

Zmodyfikowałem skrypt, który tutaj znalazłem, który pierwotnie był używany do modyfikacji daty przez 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 zmusił datę do roku "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

, aby wykonać:

./fn files-to-change

fn = nazwa twojego-pliku-tego-to-twojego-polecenia

Przykład

./fn *.JPG

zmieni datę o minus rok w katalogu, w którym się znajdujesz.

    
odpowiedział RickK 05.01.2015, 00:28
źródło
-6

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

    
odpowiedział vampiremac 28.11.2012, 09:37
źródło

Przeczytaj inne pytania na temat tagów