Câu hỏi Làm thế nào tôi có thể thay đổi ngày sửa đổi / tạo ra của một tập tin?


Có cách nào để thay đổi ngày khi một tập tin được sửa đổi / tạo ra (được hiển thị trong Nautilus hoặc với lệnh ls -l)? Lý tưởng nhất là tôi đang tìm lệnh có thể thay đổi dấu ngày / giờ của toàn bộ một loạt 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.).


192
2017-09-22 05:32


gốc




Các câu trả lời:


Bạn có thể thay đổi thời gian sửa đổi của một tệp bằng cách sử dụng touch chỉ huy:

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ư -d để chọn một ngày cụ thể. Ví dụ: để đặt tệp đang được sửa đổi hai giờ trước thời điểm hiện tại, bạn có thể sử dụng các thông tin sau:

touch -d "2 hours ago" filename

Nếu bạn muốn sửa đổi tệp tương ứng với thời gian sửa đổi hiện tại của nó thay vào đó, sau đây nên làm các trick:

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 các thông tin 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ố thành find để chỉ 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 tương ứng với thời gian 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 thể với phiên bản tương đối với thời gian tệp vì nó sử dụng trình bao để tạo các đối số cho 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. Đây là một ctime được liên kết với 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 tin không bao giờ có quyền của 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 ngẫu nhiên. Thay đổi rõ ràng 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ụ khi cập nhật ctime.


260
2017-09-22 06:34



Để đề 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/*.txt, ví dụ. - enzotib
Tôi cũng thêm rằng thay đổi ctime là không thể theo bất kỳ cách tiêu chuẩn nào. - arrange
Đây có phải là tất cả POSIX không? - user1011471
Thông tin về ctime dưới dạng thời gian thay đổi siêu dữ liệu là từ POSIX. Tôi không biết nếu các mảnh vỏ trong câu trả lời của tôi sẽ làm việc với các tiện ích shell POSIX nghiêm ngặt. 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
touch: illegal option -- d - User


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

Trong terminal, hãy vào thư mục để chỉnh sửa ngày. Sau đó nhập:

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

Bạn sẽ thấy một ">" sau khi bạn nhấn enter, exept cho lần cuối cùng -> "done".

Chú thích:  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


40
2018-03-10 14:21



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


Cách dễ nhất - được 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 NOW chỉ cần thả -t và dấu thời gian.

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

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


22
2017-12-19 14:58



Tôi đã cố gắng xác minh nó bằng cách sử dụng stat, nhưng không phải của touch cờ 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 NOW - Xerus


Chạm vào có thể tự mình tham chiếu ngày của một tệp, không cần phải gọi date hoặc sử dụng lệnh thay thế. Đây là một chút từ trang thông tin của cảm ứng:

`-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 của file trích dẫn chỉ trong trường hợp không gian, vv):

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

Sử dụng 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 bằng cách sử dụng * và cho phép for chọn tên tệp chính nó là an toàn hơn, nhưng sử dụng find -print0 | xargs -0 touch ...  nên xử lý phần lớn các nhân vật điên rồ 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 nhân vật điên trong tên tập tin ở nơi đầu tiên).

Ví dụ: để tìm tất cả các tệp trong thatdircó tên tập tin 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 đó, sử dụng:

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

6
2017-12-17 14:52





Kịch bản nhỏ này ít nhất là 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
2017-08-06 19:40



Đ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. Có thể sử dụng nhận dạng của ImageMagick. ví dụ. 'identity -verbose <image> | grep -i date', 'identifier -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 trình này (sử dụng sed để chuyển đổi ngày để đị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


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

Tôi đã sửa đổi một tập lệnh mà tôi tìm thấy ở đây, ban đầu được sử dụng để sửa đổi ngày tháng 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ày sang 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 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 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 = tên-tệp-tên-đó-là-của bạn-lệnh

Thí dụ

./fn *.JPG

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


1
2018-01-04 23:28



Giống như bình luận ở 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ởi máy ảnh. Công trình này (sử dụng sed để chuyển đổi ngày để đị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


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


-6
2017-11-28 08:37



Snej đang tìm kiếm một giải pháp dòng lệnh hoặc dòng lệnh có thể được sử dụng để sửa đổi nhiều tệp. Thay đổi thời gian và ngày của hệ thống và sửa đổi các tập tin 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 vào đâ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 một tệp trên Mac OSX (kết quả 'touch -d' trong 'tùy chọn bất hợp pháp'). - alanning
@alanning: OSX có BSD touch, không phải GNU touch. Sử dụng T. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Dominik R
Điều đó có thể có hậu quả không lường trước được. Trong một hệ điều hành hiện đại, rất nhiều tập tin đang được sửa đổi đằng sau hậu trường tất cả các thời gian. Trong khi ngày của bạn bị thay đổi, nhiều tệp khác có thể nhận được tem ngày sai trên chúng và bất kỳ điều gì cũng có thể xảy ra khi một thứ khác trong hệ thống thông báo rằng tệp cũ hơn dự kiến. - Joe