Làm cách nào để thay đổi ngày sửa đổi / tạo tệp?


234

Có cách nào để thay đổi ngày khi tệp được sửa đổi / tạo (được hiển thị trong Nautilus hoặc bằng lệnh ls -l) không? Lý tưởng nhất là tôi đang tìm kiếm một lệnh có thể thay đổi tem ngày / giờ của cả đống tệp thành một khoảng thời gian nhất định sớm hơn hoặc muộn hơn (ví dụ +8 giờ hoặc -4 ngày, v.v.).

Câu trả lời:


324

Miễn là bạn là chủ sở hữu của tệp (hoặc root), bạn có thể thay đổi thời gian sửa đổi của tệp bằng touchlệnh:

touch filename

Theo mặc định, điều này sẽ đặt thời gian sửa đổi của tệp thành thời gian hiện tại, nhưng có một số cờ, chẳng hạn như -dcờ để chọn một ngày cụ thể. Vì vậy, ví dụ, để đặt một tệp là được sửa đổi hai giờ trước khi hiện tại, bạn có thể sử dụng như sau:

touch -d "2 hours ago" filename

Thay vào đó, nếu bạn muốn sửa đổi tệp liên quan đến thời gian sửa đổi của tệp, thì sau đây nên thực hiện thủ thuật:

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

Nếu bạn muốn sửa đổi một số lượng lớn tệp, bạn có thể sử dụng như sau:

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

Bạn có thể thay đổi các đối số để findchỉ chọn các tệp bạn quan tâm. Nếu bạn chỉ muốn cập nhật thời gian sửa đổi tệp so với thời điểm hiện tại, bạn có thể đơn giản hóa việc này thành:

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

Biểu mẫu này không khả dụng với phiên bản tương đối thời gian của tệp vì nó sử dụng trình bao để tạo các đối số touch.

Theo thời gian tạo, hầu hết các hệ thống tệp Linux không theo dõi giá trị này. Có một ctimeliên kết với các tệp, nhưng nó theo dõi khi siêu dữ liệu tệp được thay đổi lần cuối. Nếu tệp không bao giờ có quyền thay đổi, nó có thể xảy ra để giữ thời gian tạo, nhưng đây là một sự trùng hợp. Thay đổi hoàn toàn thời gian sửa đổi tệp được tính là thay đổi siêu dữ liệu, do đó cũng sẽ có tác dụng phụ là cập nhật ctime.


Để đề cập đến trường hợp đơn giản hơn khi tất cả các tệp nằm trong cùng một thư mục: touch -d "2 hours ago" /path/*.txtví dụ.
enzotib

1
Tôi cũng nói thêm rằng việc thay đổi ctimelà không thể theo bất kỳ cách tiêu chuẩn nào.
sắp xếp

Đây có phải là tất cả POSIX không?
user1011471

1
Thông tin về ctimethời gian thay đổi siêu dữ liệu là từ POSIX. Tôi không biết liệu các mảnh vỏ trong câu trả lời của tôi có hoạt động với các tiện ích vỏ POSIX nghiêm ngặt hay không. Nhưng họ chắc chắn làm việc trên Ubuntu, đó là bối cảnh cho câu trả lời trên trang web này.
James Henstridge

1
Trên OSX, bạn có thể muốn sử dụng gtouchthông qua brew install coreutils.
Nobu

46

Cảm ơn đã giúp đỡ. Điều này làm việc cho tôi:

Trong thiết bị đầu cuối đi đến thư mục để chỉnh sửa ngày. Sau đó gõ:

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

Bạn sẽ thấy ">" sau khi bạn nhấn enter, ngoại trừ lần cuối cùng -> "xong".

Lưu ý: Bạn có thể muốn thay đổi "201203101513"

"201203101513" = là ngày bạn muốn cho tất cả các tệp trong thư mục này.

Xem trang web của tôi


nó không hoạt động như mong đợi nếu một tên tệp chứa khoảng trắng
Angel

Trang web không còn nữa, mặc dù là 6 năm sau. Tuy nhiên, đây là câu trả lời tôi đang tìm kiếm. Đối với những người muốn bao gồm giây trong thời gian của họ, sử dụng .sstrong đó ss là số giây. (Lưu ý: đây dường như không kiểm soát timings phụ thứ hai như nano giây hoặc mili giây, mà đối với tôi chỉ xuất hiện như số không, tuy nhiên, sự khác biệt này là cho phép sử dụng hợp cụ thể của tôi.)
Spencer D

34

Cách dễ nhất - truy cập và sửa đổi sẽ giống nhau:

touch -a -m -t 201512180130.09 fileName.ext

Ở đâu:

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

Nếu bạn muốn sử dụng NOWchỉ cần thả -tvà dấu thời gian.

Để xác minh tất cả đều giống nhau: stat fileName.ext

Xem: chạm vào người đàn ông


1
Tôi đã cố gắng xác minh bằng cách sử dụng stat, nhưng cả hai touchcờ đều không dẫn đến kết quả chính xác. Ngày sửa đổi được điều chỉnh, nhưng ngày thay đổi và ngày truy cập thực sự được thay đổi thành NGAY BÂY GIỜ
Xerus

Nó không hoạt động với tôi, nó chỉ thay đổi thời gian "Thay đổi"
Revious 5/12/18

@Revious, Xerus Sự khác biệt giữa changedthời gian và modifieddấu thời gian là gì?
ijoseph

9

Touch có thể tự tham chiếu ngày của một tệp, không cần gọi datehoặc sử dụng thay thế lệnh. Đây là một chút từ trang thông tin của touch:

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

Ví dụ: để thêm 8 giờ vào ngày của tệp (tên tệp fileđược trích dẫn chỉ trong trường hợp khoảng trắng, v.v.):

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

Sử dụng một vòng lặp trên tất cả các tệp trong thư mục hiện tại:

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

Tôi đã nghe nói rằng sử dụng a *và cho phép forchọn tên tệp sẽ an toàn hơn , nhưng sử dụng find -print0 | xargs -0 touch ... sẽ xử lý hầu hết các ký tự điên như dòng mới, dấu cách, dấu ngoặc kép, dấu gạch chéo ngược trong tên tệp. (PS. Cố gắng không sử dụng các ký tự điên trong tên tệp ở vị trí đầu tiên).

Ví dụ: để tìm tất cả các tệp thatdircó tên tệp bắt đầu bằng một svà thêm một ngày vào dấu thời gian đã sửa đổi của tệp đó, hãy sử dụng:

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

2

Kịch bản nhỏ này ít nhất làm việc cho tôi

#!/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
Điều chỉnh ngày của hình ảnh dựa trên thông tin meta trong hình ảnh sẽ khá hữu ích. Nhận dạng của ImageMagick có thể được sử dụng. ví dụ: 'nhận dạng -verbose <image> | grep -i date', 'nhận dạng -format% [exif: DateTime] <image>' có thể hiển thị '2015: 01: 08 10:19:10' (không phải tất cả hình ảnh đều có dữ liệu exif ). Công việc này (sử dụng sed để chuyển đổi ngày thành định dạng cảm ứng có thể xử lý): 'touch -d $ (xác định -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe

1

Đã lâu rồi kể từ khi tôi viết bất kỳ loại chương trình Unix nào, nhưng tôi vô tình đặt năm không chính xác trên một loạt ảnh Giáng sinh và tôi biết nếu tôi không thay đổi ngày từ 2015 đến 2014 thì đó sẽ là một vấn đề sau này .

Có lẽ, đây là một nhiệm vụ dễ dàng, nhưng tôi đã không tìm thấy bất kỳ cách đơn giản nào để thực hiện nó.

Tôi đã sửa đổi một tập lệnh tôi tìm thấy ở đây, ban đầu được sử dụng để sửa đổi ngày bằng cách trừ đi một tháng.

Đây là kịch bản gốc:

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

Đây là kịch bản sửa đổi của tôi đã buộc ngày đến năm "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

Bây giờ tôi nhận ra rằng tôi có thể đã thực hiện một phiên bản chung hơn:

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

Để sử dụng tập tin này, bạn sẽ cần phải viết nó và

chmod +x fn

để thực hiện:

./fn files-to-change

fn = your-file-name-that-is-your-lệnh

Thí dụ

./fn *.JPG

sẽ thay đổi ngày bằng cách trừ đi một năm trong thư mục bạn đang ở.


1
Tương tự như nhận xét trên. Hầu hết các tệp .jpg sẽ có ngày được nhúng trong dữ liệu meta được quảng cáo bằng máy ảnh. Công việc này (sử dụng sed để chuyển đổi ngày thành định dạng cảm ứng có thể xử lý): 'touch -d $ (xác định -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe

-6

chỉ cần thay đổi ngày và giờ trong cài đặt. Sau đó lưu tệp của bạn, nó tự động thay đổi


3
Snej đang tìm kiếm một giải pháp hàng loạt hoặc dòng lệnh có thể được sử dụng để sửa đổi nhiều tệp. Thay đổi ngày giờ hệ thống và sửa đổi các tệp có lẽ không phải là một giải pháp lý tưởng.
Fabricator4

quá nhiều triiiiiiicky !!!
Philippe Gachoud

Đối với những người có hệ điều hành khác được đưa đến đây thông qua tìm kiếm trên web, câu trả lời này là cách đơn giản nhất để thay đổi ngày của tệp trên Mac OSX ('touch -d' dẫn đến 'tùy chọn bất hợp pháp').
alanning

1
@alanning: OSX có cảm ứng BSD, không phải cảm ứng GNU. Sử dụng T. developer.apple.com/l
Dominik R

Điều đó có thể có hậu quả không lường trước. Trong một hệ điều hành hiện đại, rất nhiều tệp đang được sửa đổi đằng sau hậu trường mọi lúc. Trong khi ngày của bạn bị thay đổi, nhiều tệp khác có thể nhận được dấu ngày sai trên chúng và bất cứ điều gì có thể xảy ra khi một cái gì đó khác trong hệ thống thông báo rằng một tệp cũ hơn dự kiến.
Joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.