Bagaimana saya bisa mengubah tanggal modifikasi / pembuatan file?

234

Apakah ada cara untuk mengubah tanggal ketika file diubah / dibuat (yang diperlihatkan dalam Nautilus atau dengan perintah ls -l)? Idealnya saya mencari perintah yang dapat mengubah stempel tanggal / waktu dari sejumlah file ke waktu tertentu sebelumnya atau nanti (mis. +8 jam atau -4 hari dll.).

snej
sumber

Jawaban:

324

Selama Anda adalah pemilik file (atau root), Anda dapat mengubah waktu modifikasi file menggunakan touchperintah:

touch filename

Secara default ini akan mengatur waktu modifikasi file ke waktu saat ini, tetapi ada sejumlah flag, seperti -dflag untuk memilih tanggal tertentu. Jadi misalnya, untuk mengatur file sebagai diubah dua jam sebelum sekarang, Anda dapat menggunakan yang berikut:

touch -d "2 hours ago" filename

Jika Anda ingin memodifikasi file relatif terhadap waktu modifikasi yang ada sebagai gantinya, berikut ini harus melakukan trik:

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

Jika Anda ingin memodifikasi sejumlah besar file, Anda dapat menggunakan yang berikut ini:

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

Anda dapat mengubah argumen untuk findmemilih hanya file yang Anda minati. Jika Anda hanya ingin memperbarui waktu modifikasi file relatif terhadap waktu sekarang, Anda dapat menyederhanakan ini ke:

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

Formulir ini tidak dapat dilakukan dengan versi relatif waktu file karena menggunakan shell untuk membentuk argumen touch.

Sejauh waktu pembuatan, kebanyakan sistem file Linux tidak melacak nilai ini. Ada yang ctimeterkait dengan file, tetapi melacak ketika metadata file terakhir diubah. Jika file tidak pernah memiliki izinnya diubah, itu mungkin terjadi untuk menahan waktu pembuatan, tetapi ini adalah suatu kebetulan. Secara eksplisit mengubah waktu modifikasi file dianggap sebagai perubahan metadata, sehingga juga akan memiliki efek samping memperbarui ctime.

James Henstridge
sumber
Untuk menyebutkan kasus yang lebih sederhana ketika semua file berada di folder yang sama:, touch -d "2 hours ago" /path/*.txtmisalnya.
enzotib
1
Saya juga menambahkan bahwa mengubah ctimetidak mungkin dengan cara standar apa pun.
atur
Apakah ini semua POSIX?
user1011471
1
Informasi tentang ctimesebagai waktu perubahan metadata berasal dari POSIX. Saya tidak tahu apakah fragmen shell dalam jawaban saya akan bekerja dengan utilitas shell POSIX yang ketat. Tetapi mereka pasti bekerja di Ubuntu, yang merupakan konteks untuk jawaban di situs ini.
James Henstridge
1
Di OSX, Anda mungkin ingin menggunakan gtouchvia brew install coreutils.
Nobu
46

Terima kasih untuk bantuannya. Ini bekerja untuk saya:

Di terminal pergi ke direktori untuk mengedit tanggal. Kemudian ketik:

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

Anda akan melihat ">" setelah Anda menekan enter, kecuali untuk yang terakhir -> "selesai".

Catatan: Anda mungkin ingin mengubah "201203101513"

"201203101513" = adalah tanggal yang Anda inginkan untuk semua file di direktori ini.

Lihat halaman web saya

EFL
sumber
itu tidak berfungsi seperti yang diharapkan jika nama file berisi spasi kosong
Angel
Halaman web tidak lagi, meskipun sudah 6 tahun kemudian. Meskipun demikian, ini adalah jawaban yang saya cari. Bagi mereka yang ingin memasukkan detik dalam waktu mereka, gunakan di .ssmana ss adalah jumlah detik. (Catatan: ini tampaknya tidak mengontrol timing sub-detik seperti nanodetik atau milidetik, yang bagi saya hanya muncul sebagai nol; namun, perbedaan ini diizinkan untuk kasus penggunaan saya.)
Spencer D
34

Cara termudah - diakses dan dimodifikasi akan sama:

touch -a -m -t 201512180130.09 fileName.ext

Dimana:

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

Jika Anda ingin menggunakan NOWcukup jatuhkan -tdan cap waktu.

Untuk memverifikasi semuanya sama: stat fileName.ext

Lihat: sentuh pria

Jadeye
sumber
1
Saya mencoba memverifikasinya menggunakan stat, tetapi tak satu pun dari touchbendera mengarah ke hasil yang benar. Tanggal modifikasi disesuaikan, tetapi tanggal yang diubah dan diakses sebenarnya berubah menjadi SEKARANG
Xerus
Itu tidak bekerja untuk saya, itu hanya mengubah waktu "Ubah"
Revisi
@Revious, Xerus Apa perbedaan antara changedwaktu dan modifiedcap waktu?
ijoseph
9

Sentuhan dapat merujuk tanggal file dengan sendirinya, tidak perlu menelepon dateatau menggunakan substitusi perintah. Ini sedikit dari halaman info sentuh:

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

Misalnya, untuk menambahkan 8 jam ke tanggal file (nama file yang filedikutip hanya untuk spasi, dll):

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

Menggunakan loop atas semua file dalam direktori saat ini:

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

Saya pernah mendengar bahwa menggunakan a *dan membiarkan formemilih nama file itu sendiri lebih aman , tetapi menggunakan find -print0 | xargs -0 touch ... harus menangani sebagian besar karakter gila seperti baris baru, spasi, kutipan, garis miring terbalik dalam nama file. (PS. Cobalah untuk tidak menggunakan karakter gila dalam nama file di tempat pertama).

Misalnya, untuk menemukan semua file thatdirdengan nama file yang diawali dengan s, dan menambahkan satu hari ke cap waktu yang diubah file itu, gunakan:

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

Skrip kecil ini setidaknya berfungsi untukku

#!/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
sumber
2
Menyesuaikan tanggal gambar berdasarkan meta info dalam gambar akan sangat berguna. Identifikasi ImageMagick dapat digunakan. mis. 'identifikasikan -balik <image> | grep -i date', 'identifikasikan -format% [exif: DateTime] <image>' mungkin memperlihatkan '2015: 01: 08 10:19:10' (tidak semua gambar memiliki data exif ). Ini berfungsi (menggunakan sed untuk mengonversi tanggal ke format sentuh dapat menangani): 'touch -d $ (identifikasikan -format% [exif: DateTime] $ f | sed -r's /: / - /; s /: / - / ; ') $ f'
gaoithe
1

Sudah lama sejak saya menulis segala jenis program Unix, tapi saya tidak sengaja mengatur tahun yang salah pada sekelompok foto Natal, dan saya tahu jika saya tidak mengubah tanggal dari 2015 hingga 2014 itu akan menjadi masalah di kemudian hari .

Mungkin, ini tugas yang mudah, tetapi saya tidak menemukan cara sederhana untuk melakukannya.

Saya memodifikasi skrip yang saya temukan di sini, yang awalnya digunakan untuk mengubah tanggal dengan minus satu bulan.

Ini skrip aslinya:

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

Inilah skrip saya yang dimodifikasi yang memaksa tanggal hingga tahun "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

Sekarang saya sadar saya bisa melakukan versi yang lebih umum:

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

Untuk menggunakan file ini, Anda harus menulisnya dan

chmod +x fn

untuk mengeksekusi:

./fn files-to-change

fn = nama file Anda bahwa itu adalah perintah Anda

Contoh

./fn *.JPG

akan mengubah tanggal dengan minus satu tahun di direktori tempat Anda berada.

RickK
sumber
1
Sama seperti komentar di atas. Sebagian besar file .jpg akan memiliki tanggal yang tertanam dalam meta data yang diiklankan oleh kamera. Ini berfungsi (menggunakan sed untuk mengonversi tanggal ke format sentuh dapat menangani): 'touch -d $ (identifikasikan -format% [exif: DateTime] $ f | sed -r's /: / - /; s /: / - / ; ') $ f'
gaoithe
-6

cukup ubah tanggal dan waktu dalam pengaturan. lalu simpan file Anda, itu secara otomatis berubah

vampiremac
sumber
3
Snej sedang mencari solusi batch atau command line yang dapat digunakan untuk memodifikasi banyak file. Mengubah waktu dan tanggal sistem dan memodifikasi file mungkin bukan solusi yang ideal.
fabricator4
terlalu banyak triiiiiiicky !!!
Philippe Gachoud
Bagi mereka dengan OS lain yang dibawa ke sini melalui pencarian web, jawaban ini adalah cara paling sederhana untuk mengubah tanggal file di Mac OSX ('touch -d' menghasilkan 'opsi ilegal').
alanning
1
@alanning: OSX memiliki sentuhan BSD, bukan sentuhan GNU. Gunakan T. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R
Itu mungkin memiliki konsekuensi yang tidak terduga. Dalam OS modern, banyak file yang dimodifikasi di belakang layar sepanjang waktu. Meskipun tanggal Anda diubah, banyak file lain yang bisa mendapatkan cap tanggal yang salah pada mereka dan apa pun bisa terjadi ketika sesuatu yang lain dalam sistem memperhatikan bahwa suatu file lebih tua dari yang diharapkan.
Joe