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


क्या उस तारीख को बदलने का कोई तरीका है जब फ़ाइल संशोधित / बनाई गई थी (जो नॉटिलस में दिखाया गया है या ls -l कमांड के साथ)? आदर्श रूप से मैं एक कमांड की तलाश में हूं जो फाइलों के पूरे समूह की तारीख / समय टिकटों को पहले या बाद में (निश्चित रूप से +8 घंटे या -4 दिन इत्यादि) में बदल सकता है।


192
2017-09-22 05:32


मूल




जवाब:


आप का उपयोग कर फ़ाइल के संशोधन समय को बदल सकते हैं 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


260
2017-09-22 06:34



सरल फ़ोल्डर का उल्लेख करने के लिए जब सभी फाइलें एक ही फ़ोल्डर में हों: touch -d "2 hours ago" /path/*.txt, उदाहरण के लिए। - enzotib
मैं इसे बदलना भी जोड़ूंगा ctime किसी भी मानक तरीके से संभव नहीं है। - arrange
क्या यह सब पॉसिक्स है? - user1011471
के बारे में जानकारी ctime चूंकि मेटाडाटा परिवर्तन समय POSIX से है। मुझे नहीं पता कि मेरे उत्तर में खोल टुकड़े सख्त POSIX खोल उपयोगिताओं के साथ काम करेंगे या नहीं। लेकिन वे निश्चित रूप से उबंटू पर काम करते हैं, जो इस साइट पर उत्तर के लिए संदर्भ है। - James Henstridge
touch: illegal option -- d - User


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

टर्मिनल में दिनांक-संपादन के लिए निर्देशिका पर जाएं। फिर टाइप करें:

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

आप एंटर दबाए जाने के बाद ">" देखेंगे, पिछली बार -> "किया" के लिए बाहर निकला।

ध्यान दें:  आप "201203101513" बदलना चाहते हैं

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

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


40
2018-03-10 14:21



यह किसी फ़ाइल नाम में खाली रिक्त स्थान होने पर अपेक्षित कार्य नहीं करता है - Angel


सबसे आसान तरीका - एक्सेस और संशोधित वही होगा:

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

देख: स्पर्श आदमी


22
2017-12-19 14:58



मैंने स्टेट का उपयोग करके इसे सत्यापित करने की कोशिश की, लेकिन इनमें से कोई भी नहीं touch झंडे एक सही परिणाम के लिए नेतृत्व करते हैं। संशोधन दिनांक समायोजित किया गया है, लेकिन बदली और एक्सेस की गई तारीख वास्तव में अब बदल दी गई है - Xerus


टच किसी फ़ाइल की तारीख को स्वयं ही संदर्भित कर सकता है, कॉल करने की आवश्यकता नहीं है 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"

वर्तमान डीआईआर में सभी फाइलों पर एक लूप का उपयोग करना:

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

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

उदाहरण के लिए, सभी फाइलों को खोजने के लिए thatdirजिनके फाइलनाम एक के साथ शुरू होते हैं s, और उन फ़ाइलों के संशोधित टाइमस्टैम्प में एक दिन जोड़ें, उपयोग करें:

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

6
2017-12-17 14:52





कम से कम यह छोटी लिपि मेरे लिए काम करती है

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



छवि में मेटा जानकारी के आधार पर छवियों की तारीख को समायोजित करना बहुत उपयोगी होगा। ImageMagick की पहचान का उपयोग किया जा सकता है। जैसे 'पहचान -verbose <image> | grep -i date', 'पहचान -format% [exif: dateTime] <image>' दिखा सकता है '2015: 01: 08 10:19:10' (सभी छवियों के पास डेटा नहीं है) । यह काम करता है (प्रारूप को प्रारूप में बदलने के लिए sed का उपयोग करके स्पर्श स्पर्श कर सकते हैं): 'touch -d $ (पहचान -format% [exif: dateTime] $ f | sed -r / s /: /; s /: / - / ; ') $ एफ' - gaoithe


यह एक लंबा समय रहा है जब से मैंने किसी भी प्रकार का यूनिक्स प्रोग्राम लिखा था, लेकिन मैंने गलती से क्रिसमस की तस्वीरों के समूह पर गलत तरीके से सेट किया, और मुझे पता था कि मैंने 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 को "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
2018-01-04 23:28



उपर्युक्त टिप्पणी के समान। अधिकांश .jpg फ़ाइलों में कैमरे द्वारा समर्थित मेटा डेटा में एम्बेड की तारीख होगी। यह काम करता है (प्रारूप को प्रारूप में बदलने के लिए sed का उपयोग करके स्पर्श स्पर्श कर सकते हैं): 'touch -d $ (पहचान -format% [exif: dateTime] $ f | sed -r / s /: /; s /: / - / ; ') $ एफ' - gaoithe


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


-6
2017-11-28 08:37



स्नेज एक बैच या कमांड लाइन समाधान की तलाश में है जिसका उपयोग कई फाइलों को संशोधित करने के लिए किया जा सकता है। सिस्टम समय और तिथि बदलना और फ़ाइलों को संशोधित करना शायद एक आदर्श समाधान नहीं है। - fabricator4
बहुत ज्यादा triiiiiiicky !!! - Philippe Gachoud
वेब ओएस के माध्यम से यहां लाए गए अन्य ओएस वाले लोगों के लिए, यह जवाब मैक ओएसएक्स ('टच-डी' परिणामों 'अवैध विकल्प' में फ़ाइल की तारीख को बदलने का सबसे आसान तरीका है)। - alanning
@alanning: ओएसएक्स में बीएसडी स्पर्श है, जीएनयू स्पर्श नहीं। उपयोग टी। developer.apple.com/library/mac/documentation/Darwin/Reference/... - Dominik R
इसका अप्रत्याशित परिणाम हो सकते हैं। एक आधुनिक ओएस में, हर समय दृश्यों के पीछे कई फाइलें संशोधित हो रही हैं। जबकि आपकी तिथि बदल दी गई है, कई अन्य फाइलें उन पर गलत तिथि टिकट प्राप्त कर सकती हैं और कुछ भी हो सकता है जब सिस्टम में कुछ और नोटिस करता है कि फ़ाइल अपेक्षा से पुरानी है। - Joe