ฉันจะเปลี่ยนวันที่แก้ไข / สร้างไฟล์ได้อย่างไร?


233

มีวิธีการเปลี่ยนวันที่เมื่อไฟล์ถูกแก้ไข / สร้าง (ซึ่งจะแสดงใน Nautilus หรือด้วยคำสั่ง ls -l)? เป็นการดีที่ฉันกำลังมองหาคำสั่งที่สามารถเปลี่ยนการประทับวันที่ / เวลาของไฟล์ทั้งหมดเป็นจำนวนเวลาก่อนหน้าหรือหลังเวลาที่กำหนด (เช่น +8 ชั่วโมงหรือ -4 วันเป็นต้น)

คำตอบ:


322

ตราบใดที่คุณเป็นเจ้าของไฟล์ (หรือรูท) คุณสามารถเปลี่ยนเวลาแก้ไขของไฟล์โดยใช้touchคำสั่ง:

touch filename

โดยค่าเริ่มต้นสิ่งนี้จะตั้งค่าเวลาการแก้ไขของไฟล์เป็นเวลาปัจจุบัน แต่มีจำนวนแฟล็กเช่นแฟล็ก-dเพื่อเลือกวันที่ที่ต้องการ ตัวอย่างเช่นหากต้องการตั้งค่าไฟล์ว่าถูกแก้ไขสองชั่วโมงก่อนถึงปัจจุบันคุณสามารถใช้สิ่งต่อไปนี้:

touch -d "2 hours ago" filename

หากคุณต้องการแก้ไขไฟล์ที่เกี่ยวข้องกับเวลาการแก้ไขที่มีอยู่แทนต่อไปนี้ควรทำเคล็ดลับ:

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

หากคุณต้องการแก้ไขไฟล์จำนวนมากคุณสามารถใช้สิ่งต่อไปนี้:

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

คุณสามารถเปลี่ยนอาร์กิวเมนต์เป็นfindเพื่อเลือกไฟล์ที่คุณสนใจเท่านั้นหากคุณต้องการอัพเดตเวลาแก้ไขไฟล์ที่สัมพันธ์กับเวลาปัจจุบันคุณสามารถทำให้สิ่งนี้ง่ายขึ้นเพื่อ:

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

touchรูปแบบนี้เป็นไปไม่ได้กับรุ่นญาติเวลาไฟล์เพราะใช้เปลือกในรูปแบบข้อโต้แย้งที่จะ

เท่าที่เวลาการสร้างดำเนินไประบบไฟล์ Linux ส่วนใหญ่จะไม่ติดตามค่านี้ มีความctimeเกี่ยวข้องกับไฟล์ แต่มันจะติดตามเมื่อเมทาดาทาของไฟล์ถูกเปลี่ยนแปลงครั้งล่าสุด หากไฟล์ไม่เคยมีการเปลี่ยนแปลงสิทธิ์มันอาจจะเกิดขึ้นเพื่อระงับเวลาการสร้าง แต่นี่เป็นเรื่องบังเอิญ ctimeชัดเจนเปลี่ยนการนับเวลาแก้ไขไฟล์ที่มีการเปลี่ยนแปลงข้อมูลเมตาดังนั้นยังจะมีผลข้างเคียงของการปรับปรุงที่


พูดถึงกรณีที่ง่ายกว่าเมื่อไฟล์ทั้งหมดอยู่ในโฟลเดอร์เดียวกัน: touch -d "2 hours ago" /path/*.txtตัวอย่างเช่น
enzotib

1
ฉันยังเพิ่มการเปลี่ยนแปลงที่ctimeเป็นไปไม่ได้ในวิธีมาตรฐาน
จัด

นี่คือ POSIX ทั้งหมดหรือไม่
user1011471

1
ข้อมูลเกี่ยวกับctimeเวลาในการเปลี่ยนแปลงข้อมูลเมตามาจาก POSIX ฉันไม่รู้ว่าชิ้นส่วนเปลือกในคำตอบของฉันจะทำงานกับยูทิลิตี้เชลล์ POSIX ที่เข้มงวดหรือไม่ แต่แน่นอนว่าพวกเขาทำงานบน Ubuntu ซึ่งเป็นบริบทสำหรับคำตอบในเว็บไซต์นี้
James Henstridge

1
ใน OSX คุณอาจต้องการที่จะใช้ผ่านทางgtouch brew install coreutils
Nobu

46

ขอบคุณสำหรับความช่วยเหลือ สิ่งนี้ใช้ได้กับฉัน:

ในเทอร์มินัลไปที่ไดเรกทอรีเพื่อแก้ไขวันที่ จากนั้นพิมพ์:

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

คุณจะเห็น ">" หลังจากที่คุณกด Enter ยกเว้นครั้งสุดท้าย -> "เสร็จสิ้น"

หมายเหตุ: คุณอาจต้องการเปลี่ยน "201203101513"

"201203101513" = คือวันที่คุณต้องการสำหรับไฟล์ทั้งหมดในไดเรกทอรีนี้

ดูหน้าเว็บของฉัน


มันไม่ทำงานอย่างที่คาดไว้ถ้าชื่อไฟล์มีช่องว่าง
Angel

หน้าเว็บไม่มีอีกต่อไปแม้ว่ามันจะเป็น 6 ปีต่อมา อย่างไรก็ตามนี่คือคำตอบที่ฉันต้องการ สำหรับผู้ที่ต้องการรวมวินาทีในเวลาของพวกเขาใช้โดย.ssที่ssคือจำนวนวินาที (หมายเหตุ: นี่ดูเหมือนจะไม่ควบคุมการกำหนดเวลาย่อยวินาทีเช่นนาโนวินาทีหรือมิลลิวินาทีซึ่งสำหรับฉันเพิ่งปรากฏเป็นศูนย์อย่างไรก็ตามความแตกต่างนี้ได้รับอนุญาตสำหรับกรณีการใช้งานของฉัน)
Spencer D

34

วิธีที่ง่ายที่สุด - การเข้าถึงและแก้ไขจะเหมือนกัน:

touch -a -m -t 201512180130.09 fileName.ext

ที่ไหน:

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

หากคุณต้องการใช้NOWเพียงแค่ปล่อย-tและการประทับเวลา

หากต้องการตรวจสอบพวกเขาเหมือนกันทั้งหมด: stat fileName.ext

ดู: สัมผัสชาย


1
ฉันพยายามตรวจสอบโดยใช้สถิติ แต่ไม่มีtouchแฟล็กใดที่นำไปสู่ผลลัพธ์ที่ถูกต้อง วันที่แก้ไขถูกปรับ แต่วันที่เปลี่ยนแปลงและวันที่เข้าถึงถูกเปลี่ยนเป็นจริงตอนนี้
Xerus

มันใช้งานไม่ได้สำหรับฉันมันเปลี่ยนเฉพาะเวลา "เปลี่ยน"
Revious

@Revious, Xerus ความแตกต่างระหว่างchangedเวลากับการmodifiedประทับเวลาคืออะไร?
ijoseph

9

Touch สามารถอ้างอิงวันที่ของไฟล์ได้ด้วยตัวเองไม่จำเป็นต้องโทรdateหรือใช้การทดแทนคำสั่ง นี่เป็นบิตจากหน้าข้อมูลของ 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.

ตัวอย่างเช่นหากต้องการเพิ่ม 8 ชั่วโมงในวันที่ของไฟล์ (ชื่อไฟล์ที่fileยกมาในกรณีของช่องว่าง ฯลฯ ):

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

ใช้วนรอบไฟล์ทั้งหมดใน dir ปัจจุบัน:

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

ฉันได้ยินมาว่าการใช้ a *และให้forเลือกชื่อไฟล์นั้นปลอดภัยกว่าแต่การใช้find -print0 | xargs -0 touch ... ควรจัดการตัวละครที่บ้าที่สุดเช่นการขึ้นบรรทัดใหม่เว้นวรรคเครื่องหมายคำพูดแบ็กสแลชในชื่อไฟล์ (PS. พยายามอย่าใช้ตัวละครบ้าในชื่อไฟล์ตั้งแต่แรก)

ตัวอย่างเช่นในการค้นหาไฟล์ทั้งหมดthatdirที่ชื่อไฟล์ขึ้นต้นด้วยsและเพิ่มหนึ่งวันในเวลาประทับที่แก้ไขของไฟล์เหล่านั้นให้ใช้:

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

2

อย่างน้อยสคริปต์นี้ทำงานได้สำหรับฉัน

#!/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
การปรับวันที่ของภาพตามข้อมูลเมตาในภาพจะมีประโยชน์ทีเดียว สามารถใช้การระบุตัวตนของ ImageMagick เช่น 'ident -verbose <image> | grep -i date', 'ident -format% [exif: DateTime] <image>' อาจแสดง '2015: 01: 08 10:19:10' (รูปภาพทั้งหมดไม่มีข้อมูล exif ) วิธีนี้ใช้งานได้ (โดยใช้ sed เพื่อแปลงวันที่เป็นรูปแบบการสัมผัสสามารถจัดการได้): 'touch -d $ (ระบุ -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / / ; ') $ f'
gaoithe

1

เป็นเวลานานแล้วที่ฉันได้เขียนโปรแกรม Unix แต่ฉันตั้งใจตั้งปีที่ไม่ถูกต้องในรูปของคริสมาสต์รูปถ่ายและฉันรู้ว่าถ้าฉันไม่เปลี่ยนวันจาก 2015 เป็น 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 ${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

นี่คือสคริปต์ที่แก้ไขของฉันซึ่งบังคับให้วันที่ปี "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

ตอนนี้ฉันรู้แล้วว่าฉันสามารถทำรุ่นทั่วไปได้มากกว่านี้:

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

ในการใช้ไฟล์นี้คุณจะต้องเขียนและ

chmod +x fn

เพื่อดำเนินการ:

./fn files-to-change

Fn = ของคุณชื่อไฟล์ที่เป็นของคุณคำสั่ง

ตัวอย่าง

./fn *.JPG

จะเปลี่ยนวันที่ลบหนึ่งปีในไดเรกทอรีที่คุณอยู่


1
เช่นเดียวกับความคิดเห็นข้างต้น ไฟล์. jpg ส่วนใหญ่จะมีวันที่ฝังอยู่ในข้อมูลเมตาที่โฆษณาโดยกล้อง วิธีนี้ใช้งานได้ (โดยใช้ sed เพื่อแปลงวันที่เป็นรูปแบบการสัมผัสสามารถจัดการได้): 'touch -d $ (ระบุ -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / / ; ') $ f'
gaoithe

-6

เพียงแค่เปลี่ยนวันที่และเวลาในการตั้งค่า จากนั้นบันทึกไฟล์ของคุณมันจะเปลี่ยนโดยอัตโนมัติ


3
Snej กำลังมองหาโซลูชันแบบบรรทัดหรือแบตช์ที่สามารถใช้เพื่อแก้ไขไฟล์หลายไฟล์ การเปลี่ยนเวลาและวันที่ของระบบและการแก้ไขไฟล์อาจไม่ใช่วิธีแก้ปัญหาในอุดมคติ
fabricator4

triiiiiiicky มากเกินไป !!!
Philippe Gachoud

สำหรับผู้ที่มีระบบปฏิบัติการอื่นมาที่นี่ผ่านการค้นหาเว็บคำตอบนี้เป็นวิธีที่ง่ายที่สุดในการเปลี่ยนวันที่ของไฟล์ใน Mac OSX (ผลลัพธ์ 'สัมผัส -d' ใน 'ตัวเลือกที่ผิดกฎหมาย')
ประกาศ

1
@alanning: OSX มี BSD touch ไม่ใช่ GNU touch ใช้ -t developer.apple.com/library/mac/documentation/Darwin/Reference/
......

นั่นอาจส่งผลที่คาดไม่ถึง ในระบบปฏิบัติการที่ทันสมัยไฟล์จำนวนมากกำลังได้รับการดัดแปลงเบื้องหลังตลอดเวลา ในขณะที่วันที่ของคุณมีการเปลี่ยนแปลงไฟล์อื่น ๆ จำนวนมากอาจได้รับประทับวันที่ผิดเกี่ยวกับพวกเขาและสิ่งที่อาจเกิดขึ้นเมื่อสิ่งอื่นในระบบสังเกตว่าไฟล์เก่ากว่าที่คาดไว้
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.