Bir dosyanın değiştirilmiş / oluşturulmuş tarihini nasıl değiştirebilirim?

191

Bir dosyanın değiştirildiği / oluşturulduğu tarihi (Nautilus'ta veya ls -l komutuyla gösterilir) değiştirmenin bir yolu var mı? İdeal olarak, bir grup dosyanın tarih / zaman damgalarını, daha önce veya daha sonra belirli bir süreye (örn., +8 saat veya -4 gün vb.) Dönüştürebilen bir komut arıyorum.

    
sordu snej 22.09.2011 07:32

7 cevap

258

Bir dosyanın değişiklik zamanını touch komutunu kullanarak değiştirebilirsiniz:

touch filename

Varsayılan olarak bu, dosyanın değişiklik zamanını geçerli saate göre ayarlayacaktır, ancak belirli bir tarihi seçmek için -d bayrağı gibi bir dizi bayrak vardır. Örneğin, bir dosyayı şu andan iki saat önce değiştirilmek üzere ayarlamak için aşağıdakileri kullanabilirsiniz:

touch -d "2 hours ago" filename

Dosyayı mevcut değişiklik zamanına göre değiştirmek istiyorsanız, aşağıdakiler hile yapmalıdır:

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

Çok sayıda dosyayı değiştirmek isterseniz, aşağıdakileri kullanabilirsiniz:

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

İlgilendiğiniz dosyaları seçmek için argümanları find olarak değiştirebilirsiniz. Yalnızca dosya değiştirme sürelerini şimdiki zamana göre güncellemek istiyorsanız, bunu aşağıdaki gibi basitleştirebilirsiniz:

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

Bu form, dosya sürümü göreceli sürümü ile mümkün değildir, çünkü kabukları touch argümanı oluşturmak için kullanır.

Oluşturma süresi uzadıkça, çoğu Linux dosya sistemi bu değeri takip etmez. Dosyalarla ilişkili ctime var, ancak dosya meta verileri en son değiştirildiği zaman izleniyor. Dosyanın izinleri hiç değişmemişse, yaratma süresini tutabilir, ancak bu bir tesadüf. Dosya değişiklik süresinin açıkça değiştirilmesi, meta veri değişikliği olarak sayılır. Bu nedenle, ctime 'yi güncellemenin yan etkisi de olacaktır.

    
verilen cevap James Henstridge 22.09.2011 08:34
39

Yardım için teşekkürler. Bu benim için çalıştı:

Terminalde tarih düzenleme için dizine gidin. Sonra yazın:

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

Gördüğünüz bir "& gt;" Enter tuşuna bastıktan sonra, son kez hariç tutuldu - & gt; "Bitti".

Not:  "201203101513" ifadesini değiştirmek isteyebilirsiniz

"201203101513" = bu dizindeki tüm dosyalar için istediğiniz tarih.

Web sayfama bakın

    
verilen cevap EFL 10.03.2012 15:21
22

En kolay yol - erişilen ve değiştirilenler aynı olacaktır:

touch -a -m -t 201512180130.09 fileName.ext

Burada:

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

NOW değerini kullanmak isterseniz, -t ve zaman damgasını bırakın.

Hepsinin aynı olduklarını doğrulamak için: % Co_de%

Bakınız: Dokunma erkeği

    
verilen cevap Jadeye 19.12.2015 15:58
6

Dokunma, bir dosyanın tarihini tek başına referans gösterebilir, date 'yi çağırmaya veya komut ikamesini kullanmaya gerek yoktur. Dokunma bilgi sayfasından biraz:

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

Örneğin, bir dosyanın tarihine 8 saat eklemek için (yalnızca alan, vb. durumlarda alıntılanan file dosyasının adı):

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

Geçerli direkteki tüm dosyalar üzerinde bir döngü kullanma:

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

* kullanarak ve for dosya isminin kendisinin daha güvenli olduğunu seçtiğini, ancak find -print0 | xargs -0 touch ... değerini kullanmanın çoğu yeni satırlar, boşluklar, tırnak işaretleri, bir dosya adında ters eğik çizgi. (PS. Dosya adlarında çılgın karakterler kullanmamaya çalışın).

Örneğin, dosya adlarını thatdir ile başlatan s dosyasındaki tüm dosyaları bulmak ve bu dosyanın değiştirilen zaman damgasına bir gün eklemek için aşağıdakileri kullanın:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
verilen cevap Xen2050 17.12.2016 15:52
2

Bu küçük komut en azından benim için çalışıyor

#!/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
    
verilen cevap joakim 06.08.2013 21:40
1

Herhangi bir Unix programı yazdığımdan beri çok uzun zaman geçti, fakat yanlışlıkla bir kaç Noel fotoğrafına yanlışlıkla rastladım ve 2015'ten 2014'e kadar olan tarihi değiştiremediğimi biliyordum. sorun daha sonra.

Belki bu kolay bir iştir, ancak bunu yapmanın kolay bir yolunu bulamadım.

Burada bulduğum bir yazıyı, orijinal olarak bir önceki eksi bir ay olarak değiştirmek için kullanılan bir komut dosyasını değiştirdim.

İşte orijinal senaryo:

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

İşte tarihi "2014" yılına zorlayan değiştirilmiş kodum:

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

Şimdi daha genel bir versiyon yapmış olabileceğimin farkındayım:

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

Bu dosyayı kullanmak için yazmanız ve

chmod +x fn

yürütmek için:

./fn files-to-change

fn = your-dosya adı-o-is-your-komuta

Örnek

./fn *.JPG

, tarihi, bulunduğunuz dizinde bir yıl eksi olarak değiştirir.

    
verilen cevap RickK 05.01.2015 00:28
-6

Ayarlarda sadece tarih ve saati değiştir. daha sonra dosyanızı kaydedin, otomatik olarak değişir

    
verilen cevap vampiremac 28.11.2012 09:37

Etiketlerdeki diğer soruları oku