Bir dosyanın değiştirildiği / oluşturulduğu tarihi nasıl değiştirebilirim?


233

Bir dosyanın değiştirildiği / yaratıldığı tarihi değiştirmenin bir yolu var mı (Nautilus'ta veya ls -l komutuyla gösterilir)? İdeal olarak, bütün bir dosya grubunun tarih / saat damgalarını daha önce veya sonra belirli bir zaman diliminde değiştirebilecek bir komut arıyorum (örneğin +8 saat veya -4 gün vb.).

Yanıtlar:


322

Dosyanın (veya kökün) sahibi olduğunuz sürece, şu touchkomutu kullanarak bir dosyanın değiştirme süresini değiştirebilirsiniz :

touch filename

Varsayılan olarak bu, dosyanın değişiklik zamanını geçerli saate ayarlar, ancak -dbelirli bir tarih seçmek için bayrak gibi bazı bayraklar vardır . Örneğin, bir dosyayı şimdiki saatten iki saat önce değiştirilmiş olarak 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 yerine, aşağıdakileri yapmanız gerekir:

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

findYalnızca ilgilendiğiniz dosyaları seçmek için argümanları değiştirebilirsiniz . Yalnızca geçerli zamana göre dosya değiştirme zamanlarını güncellemek istiyorsanız, aşağıdakileri basitleştirebilirsiniz:

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

Bu form, dosya zamanı göreli sürümünde mümkün değildir, çünkü argümanları oluşturmak için kabuğu kullanır touch.

Oluşturma zamanı geldiğinde, çoğu Linux dosya sistemi bu değeri takip etmez. Orada bir olan ctimedosyaları ile ilişkili, ancak dosya meta son değiştirildi ne zaman izler. Dosyanın izinleri hiç değişmediyse, oluşturma süresini tutabilir, ancak bu bir tesadüf. Dosya değiştirme zamanını açıkça değiştirmek, bir meta veri değişikliği olarak sayılır; bu nedenle, güncellemenin yan etkisi de olacaktır ctime.


Tüm dosyalar aynı klasördeyken basit durumdan bahsetmek gerekirse: touch -d "2 hours ago" /path/*.txtörneğin.
enzotib

1
Ayrıca değiştirmenin ctimehiçbir şekilde standart bir şekilde mümkün olmadığını da eklerdim.
düzenleme

Hepsi POSIX mi?
user1011471 10:15

1
ctimeMeta veri değişim süresi hakkında bilgi POSIX'dendir. Cevabımdaki kabuk parçalarının katı POSIX kabuk yardımcı programlarıyla çalışıp çalışmayacağını bilmiyorum. Ama kesinlikle bu sitedeki cevapların içeriği olan Ubuntu üzerinde çalışıyorlar.
James Henstridge,

1
OSX'te, gtouchüzerinden kullanmak isteyebilirsiniz brew install coreutils.
Nobu

46

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

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

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

Enter tuşuna basıldıktan sonra ">" göreceksiniz, son kez hariç -> "bitmiş".

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

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

Web sayfama bak


Bir dosya adı boşluk içeriyorsa beklendiği gibi çalışmaz
Angel

Web sayfası artık 6 yıl sonra olmasına rağmen artık değil. Yine de aradığım cevap buydu. Onların zamanında saniye dahil etmek isteyenler için, kullanmak .ssnerede ss saniye sayısıdır. (Not: Bu tür beni sadece sıfır olarak ortaya için nanosaniye veya milisaniye gibi alt ikinci zamanlamalarını kontrol görünmüyor, ancak bu fark benim bir kullanım örneği için izin oldu.)
Spencer D

34

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

touch -a -m -t 201512180130.09 fileName.ext

Nerede:

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

Kullanmak istiyorsanız NOWsadece -tve zaman damgasını bırakın .

Hepsinin aynı olduğunu doğrulamak için: stat fileName.ext

Bakınız: dokunma adam


1
Stat kullanarak doğrulamaya çalıştım, ancak touchbayrakların hiçbiri doğru sonuç vermedi. Değişiklik tarihi ayarlandı, ancak değişiklik yapıldı ve erişim tarihi aslında ŞİMDİ olarak değiştirildi
Xerus 19.03.2018

Benim için işe yaramadı, sadece "Değişim" zamanını değiştirdi
16

@Revious, Xerus changedZaman ve modifiedzaman damgası arasındaki fark nedir ?
ijoseph

9

Dokunma bir dosyanın tarihine tek başına başvurabilir, çağrı yapmaya dateveya komut değiştirmeye gerek kalmaz . İşte dokunmanın 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 ( fileyalnızca boşluk durumunda alıntılanan dosya adı vb.):

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

Geçerli dizindeki tüm dosyalar üzerinde bir döngü kullanmak:

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

Bir *ve bir fordosya adının seçilmesine izin vermenin kendisinin daha güvenli olduğunu duymuştum , ancak bunun kullanımı , bir dosya adındaki yeni satırlar, boşluklar, tırnak işaretleri, ters eğik çizgiler gibi çoğu çılgın karakterlerle find -print0 | xargs -0 touch ... başa çıkmalı. (Not: İlk olarak dosya adlarında çılgın karakterler kullanmamaya çalışın).

Örneğin, thatdirdosya adları bir ile başlayan tüm dosyaları bulmak sve bu dosyanın değiştirilmiş zaman damgasına bir gün eklemek için şunu kullanın:

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

2

Bu küçük senaryo 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

2
Görüntülerin tarihini, görüntüdeki meta bilgilere göre ayarlamak oldukça yararlı olacaktır. ImageMagick'in kimliği kullanılabilir. örneğin 'tanımlamak -verbose <image> | grep -i date', 'tanımlamak -format% [exif: DateTime] <image>' '2015: 01: 08 10:19:10' gösterebilir (tüm resimlerde exif veri yoktur. ). Bu çalışır (dokunuş biçimini işlemek için tarihi dönüştürmek için sed kullanmak): 'touch -d $ (tanımlamak -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe

1

Herhangi bir Unix programı yazdığımdan bu yana çok zaman geçti, ancak yanlışlıkla bir dizi Noel fotoğrafına yanlışlıkla yıl ayarladım ve 2015'ten 2014'e kadar tarih değiştirmesem bunun sorun olacağını biliyordum. .

Belki, bu kolay bir iştir, fakat yapmak için basit bir yol bulamadım.

Burada bulduğum bir betiği değiştirdim, ki başlangıçta tarihi eksi bir ay olarak değiştirmek için kullanıldı.

İş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 tarihimi "2014" yılına zorlayan değiştirilmiş betiğim:

#!/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 versiyonunu yapabileceğ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 gerekir ve

chmod +x fn

yürütmek için:

./fn files-to-change

fn = your-dosya-ismi-o-is-your-komuta

Örnek

./fn *.JPG

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


1
Yukarıdaki yorum ile aynı. .Jpg dosyalarının çoğu, kamera tarafından eklenen meta verilere katıştırılmış bir tarihe sahiptir. Bu çalışır (dokunuş biçimini işlemek için tarihi dönüştürmek için sed kullanmak): 'touch -d $ (tanımlamak -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
49’da

-6

sadece ayarlarda tarih ve saati değiştirin. sonra dosyanızı kaydedin, otomatik olarak değişir


3
Snej, birden fazla dosyayı değiştirmek için kullanılabilecek bir toplu iş veya komut satırı çözümü arıyor. Sistem saatini ve tarihini değiştirmek ve dosyaları değiştirmek muhtemelen ideal bir çözüm değildir.
fabrikatör4

çok fazla triiiiiiicky !!!
Philippe Gachoud

Web işletim sistemi aracılığıyla buraya getirilen diğer işletim sistemlerine sahip olanlar için, bu cevap Mac OSX'te bir dosyanın tarihini değiştirmenin en basit yoludur ('touch -d', 'yasadışı seçenekle sonuçlanır).
Şubat'ta alanning

1
@alanning: OSX, GNU dokunuşuna değil BSD dokunuşuna sahiptir. -T kullanın. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R

Bunun öngörülemeyen sonuçları olabilir. Modern bir işletim sisteminde her zaman birçok dosya sahne arkasında değişiyor. Tarihiniz değiştirilirken, diğer birçok dosya üzerinde yanlış tarih damgaları olabilir ve sistemdeki bir şey beklenenden daha eski olduğunu fark ettiğinde her şey olabilir.
Joe,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.