मैं किसी फ़ाइल की संशोधित / बनाई गई तिथि कैसे बदल सकता हूँ?


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

जहां तक ​​सृजन का समय है, अधिकांश लिनक्स फ़ाइल सिस्टम इस मान का ट्रैक नहीं रखते हैं। वहाँ एक है ctimeफ़ाइलों के साथ जुड़े, लेकिन यह पटरियों जब फ़ाइल मेटाडाटा पिछले बदल गया था। यदि फ़ाइल की अनुमतियाँ कभी नहीं बदली गई हैं, तो हो सकता है कि यह निर्माण का समय हो, लेकिन यह एक संयोग है। स्पष्ट रूप से फ़ाइल संशोधन समय को मेटाडेटा परिवर्तन के रूप में बदलता है, इसलिए अद्यतन करने का दुष्प्रभाव भी होगा ctime


सरल फ़ाइल का उल्लेख करने के लिए जब सभी फाइलें एक ही फ़ोल्डर में होती हैं: touch -d "2 hours ago" /path/*.txtउदाहरण के लिए।
enzotib

1
मैं यह भी जोड़ना चाहता हूं कि ctimeकिसी भी मानक तरीके से इसे बदलना संभव नहीं है।
व्यवस्था करें

क्या यह सब POSIX है?
user1011471

1
ctimeमेटाडेटा परिवर्तन समय के रूप में जानकारी POSIX से है। मुझे नहीं पता कि मेरे जवाब में शेल के टुकड़े सख्त POSIX शेल उपयोगिताओं के साथ काम करेंगे या नहीं। लेकिन वे निश्चित रूप से उबंटू पर काम करते हैं, जो इस साइट पर उत्तर के लिए संदर्भ है।
जेम्स हेनस्ट्रिज

1
OSX पर, आप के gtouchमाध्यम से उपयोग करना चाह सकते हैं brew install coreutils
नोबू

46

सहायता के लिए धन्यवाद। यह मेरे लिए काम किया:

टर्मिनल में डेट-एडिट के लिए डायरेक्टरी में जाएं। फिर टाइप करें:

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

आप हिट करने के बाद ">" देखते हैं, अंतिम बार छूटते हैं -> "किया"।

नोट: आप "201203101513" बदलना चाहते हैं

"201203101513" = वह तिथि है जो आप इस निर्देशिका की सभी फाइलों के लिए चाहते हैं।

मेरा वेबपेज देखें


यह अपेक्षा के अनुरूप काम नहीं करता है यदि फ़ाइल नाम में रिक्त स्थान है
एंजेल

वेबपेज अब नहीं है, हालांकि यह 6 साल बाद है। बहरहाल, यह वह उत्तर है जिसकी मुझे तलाश थी। उन लोगों के लिए जो अपने समय में सेकंड शामिल करना चाहते हैं, .ssजहां ss सेकंड की संख्या है। (नोट: यह सब-सेकंड टाइमिंग जैसे कि नैनोसेकंड या मिलीसेकंड को नियंत्रित करने के लिए प्रतीत नहीं होता है, जो मेरे लिए सिर्फ शून्य के रूप में दिखाई दिया; हालांकि, यह अंतर मेरे उपयोग-मामले के लिए स्वीकार्य था।)
स्पेन्सर

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ध्वज सही परिणाम नहीं देता है। संशोधन की तारीख समायोजित की गई है, लेकिन परिवर्तित और एक्सेस की गई तिथि वास्तव में अब बदल गई है
ज़ेरुस

यह मेरे लिए काम नहीं किया है, यह केवल "बदलें" समय बदल
छला

@ स्पष्ट, ज़ेरुस changedसमय और modifiedटाइमस्टैम्प में क्या अंतर है ?
ijoseph

9

टच एक फ़ाइल की तारीख को सभी के द्वारा संदर्भित कर सकता है, dateकमांड प्रतिस्थापन को कॉल या उपयोग करने की कोई आवश्यकता नहीं है । यहाँ स्पर्श के जानकारी पृष्ठ से थोड़ा सा है:

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

मैंने सुना है कि फिल्नाम का उपयोग करने *और forखुद को सुरक्षित रखने की अनुमति देता है , लेकिन एक फाइलनाम में newlines, रिक्त स्थान, उद्धरण, बैकस्लैश जैसे अधिकांश पागल पात्रों find -print0 | xargs -0 touch ... को संभालना चाहिए । (पुनश्च। पहली जगह में फ़ाइल नाम में पागल पात्रों का उपयोग न करने की कोशिश करें)।

उदाहरण के लिए, उन सभी फ़ाइलों को खोजने के लिए 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 की पहचान का उपयोग किया जा सकता है। उदाहरण के लिए 'आइडेंटिटी -वरबोस <इमेज> | ग्रीप -आई डेट', 'आइडेंट -फॉर्मैट% [एक्सिफ: डेटटाइम] <इमेज>' शो '2015': 01: 08 10:19:10 '(सभी इमेज में एक्सिफ डेटा नहीं है )। यह काम करता है (सेड को फॉर्मेट टच में डेट कन्वर्ट करने के लिए इस्तेमाल कर सकते हैं): 'टच -d $ (आइडेंट -फॉर्मट% [एक्सिफ: डेटाइम] $ f | sed -r' s /: / - / s /: / / ; ') $ f'
गौएथे

1

मुझे यूनिक्स के किसी भी प्रकार के कार्यक्रम को लिखने में काफी समय हो गया है, लेकिन मैंने गलती से साल को क्रिसमस की तस्वीरों के झुंड में गलत तरीके से सेट कर दिया था, और मुझे पता था कि अगर मैंने 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 फाइलों में कैमरा द्वारा एड किए गए मेटा डेटा में दिनांक अंकित होगा। यह काम करता है (सेड को फॉर्मेट टच में डेट कन्वर्ट करने के लिए इस्तेमाल कर सकते हैं): 'टच -d $ (आइडेंट -फॉर्मट% [एक्सिफ: डेटटाइम] $ f | sed -r' s /: / - / s /: / / ; ') $ f'
गौहत्या

-6

बस सेटिंग्स में तारीख और समय बदलें। फिर अपनी फ़ाइल सहेजें, यह अपने आप बदल जाता है


3
स्नेह एक बैच या कमांड लाइन समाधान की तलाश में है जिसका उपयोग कई फ़ाइलों को संशोधित करने के लिए किया जा सकता है। सिस्टम का समय और तारीख बदलना और फाइलों को संशोधित करना शायद एक आदर्श समाधान नहीं है।
fabricator4

बहुत ज्यादा त्रियाणीकी !!!
फिलिप गाचौड

वेब खोज के माध्यम से अन्य OS के साथ यहां आने वालों के लिए, यह उत्तर मैक OSX पर फ़ाइल की तारीख को बदलने का सबसे सरल तरीका है ('टच-डी' परिणाम 'अवैध विकल्प')।
18'14

1
@alanning: OSX में BSD टच है, GNU टच नहीं। उपयोग टी। developer.apple.com/library/mac/documentation/Darwin/Reference/…
डोमिनिक आर

इसके अप्रत्याशित परिणाम हो सकते हैं। एक आधुनिक ओएस में, बहुत सारी फाइलें पर्दे के पीछे हर समय संशोधित हो रही हैं। जब आपकी तारीख बदली जाती है, तो कई अन्य फाइलें उन पर गलत तारीखों के स्टैम्प लगा सकती हैं और कुछ भी हो सकता है जब सिस्टम नोटिस में कुछ और हो जो एक फाइल अपेक्षा से अधिक पुरानी हो।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.