আমি কীভাবে কোনও ফাইলের পরিবর্তিত / তৈরি তারিখ পরিবর্তন করতে পারি?


233

কোনও ফাইল যখন পরিবর্তন / তৈরি করা হয়েছিল (যা নটিলাসে বা 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আগ্রহী ফাইলগুলি বেছে নিতে আপনি আর্গুমেন্টগুলি পরিবর্তন করতে পারেন you আপনি যদি বর্তমান সময়ের তুলনায় কেবলমাত্র ফাইল সংশোধন বার আপডেট করতে চান তবে আপনি এটিকে সহজ করতে পারবেন:

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

ফাইল সময় সম্পর্কিত সংস্করণ দিয়ে এই ফর্মটি সম্ভব নয় কারণ এটি শেলটি যুক্তি গঠনের জন্য ব্যবহার করে touch

যতক্ষণ না তৈরির সময় চলে যায়, বেশিরভাগ লিনাক্স ফাইল সিস্টেমগুলি এই মানটির উপর নজর রাখে না। এখানে ctimeফাইলগুলির সাথে সম্পর্কিত রয়েছে তবে ফাইল মেটাডেটা শেষবার কখন পরিবর্তন হয়েছিল তা ট্র্যাক করে। যদি ফাইলটির অনুমতি কখনও পরিবর্তন না হয় তবে এটি তৈরির সময়টি ধরে রাখতে পারে তবে এটি একটি কাকতালীয় ঘটনা। স্পষ্টভাবে ফাইল পরিবর্তনের সময় গণনাগুলি মেটাডেটা পরিবর্তনের হিসাবে গণ্য করা হয়, সুতরাং এটি আপডেট করার পার্শ্ব প্রতিক্রিয়াও থাকবে ctime


সরল ক্ষেত্রে উল্লেখ করার জন্য যখন সমস্ত ফাইল একই ফোল্ডারে থাকে: touch -d "2 hours ago" /path/*.txtউদাহরণস্বরূপ।
enzotib

1
আমি আরও যোগ করব যে ctimeকোনও মানক পদ্ধতিতে পরিবর্তনটি সম্ভব নয়।
ব্যবস্থা করুন

এটি কি সব পসিক্স?
ব্যবহারকারী 1011471

1
ctimeমেটাডেটা পরিবর্তনের সময় হিসাবে তথ্য পসিক্স থেকে। আমি জানি না আমার উত্তরের শেল টুকরাগুলি কঠোর পসিক্স শেল ইউটিলিটিগুলির সাথে কাজ করবে কিনা। তবে তারা অবশ্যই উবুন্টুতে কাজ করবেন যা এই সাইটের উত্তরের প্রসঙ্গ।
জেমস হেনস্ট্রিজ

1
ওএসএক্স-এ আপনি এর gtouchমাধ্যমে ব্যবহার করতে পারেন brew install coreutils
Nou

46

সাহায্যের জন্য ধন্যবাদ. এটি আমার পক্ষে কাজ করেছে:

টার্মিনালে তারিখ-সম্পাদনার জন্য ডিরেক্টরিতে যান। তারপরে টাইপ করুন:

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

আপনি প্রবেশের পরে "" "দেখতে পাবেন, শেষবারের জন্য উপস্থাপিত ->" সম্পন্ন "

দ্রষ্টব্য: আপনি "201203101513" পরিবর্তন করতে পারেন

"201203101513" = এই ডিরেক্টরিতে থাকা সমস্ত ফাইলের জন্য আপনি যে তারিখটি চান তা হল।

আমার ওয়েবপৃষ্ঠা দেখুন


কোনও ফাইলের নামের ফাঁকা স্থান থাকলে এটি প্রত্যাশার মতো কাজ করে না
অ্যাঞ্জেল

ওয়েবপৃষ্ঠাটি আর নেই, যদিও এটি years বছর পরে। যাইহোক, এটিই আমি উত্তরটি খুঁজছিলাম। যারা তাদের সময়গুলিতে সেকেন্ড অন্তর্ভুক্ত করতে চান তাদের ব্যবহার করুন .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পতাকাগুলির মধ্যে একটিও সঠিক ফলাফল হতে পারে না। পরিবর্তনের তারিখটি সামঞ্জস্য করা হয়েছে, তবে পরিবর্তিত এবং অ্যাক্সেস করা তারিখটি এখনই এখন পরিবর্তিত হয়েছে
Xerus

এটি আমার পক্ষে কাজ করেনি, এটি কেবল "পরিবর্তন" সময় পরিবর্তন করেছে
রিসিয়ার

@ স্পষ্টত, জেরাস changedসময় এবং modifiedটাইমস্ট্যাম্পগুলির মধ্যে পার্থক্য কী ?
আইজোসেফ

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"

বর্তমান ডিয়ারের সমস্ত ফাইলের উপর একটি লুপ ব্যবহার করা:

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' '{}'

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
ছবিতে মেটা তথ্যের উপর ভিত্তি করে চিত্রগুলির তারিখ সামঞ্জস্য করা বেশ কার্যকর হবে। ইমেজম্যাগিকের সনাক্তকরণ ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ 'সনাক্ত -verbose <চিত্র> | গ্রেপ -i তারিখ', 'সনাক্তকরণ-ফর্ম্যাট% [exif: তারিখটাইম] <চিত্র>' দেখানো হতে পারে '2015: 01: 08 10:19:10' (সমস্ত চিত্রের এক্সিফ ডেটা নেই )। এটি কাজ করে (তারিখ রূপান্তর করতে সেড ব্যবহার করে টাচ হ্যান্ডেল করতে পারে): 'টাচ-ডি $ (শনাক্তকরণ-ফর্ম্যাট% [উপস্থিত: তারিখটাইম] $ চ | সেড-র' s /: / / /; এস /: / - / / ; ') $ চ'
গাওইথ

1

যেহেতু আমি কোনও ধরণের ইউনিক্স প্রোগ্রাম লিখেছি, কিন্তু অনেক দিন হয়ে গেছে, তবে আমি ঘটনাক্রমে ক্রিসমাসের একগুচ্ছ ছবিতে বছরটি ভুলভাবে সেট করেছিলাম এবং আমি জানতাম যে ২০১৫ থেকে ২০১৪ তারিখের তারিখটি পরিবর্তন না করলে এটি পরে সমস্যা হবে 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

এখানে আমার পরিবর্তিত স্ক্রিপ্ট যা তারিখটি "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 = আপনার ফাইল-নাম-যে-is-আপনার-কমান্ড

উদাহরণ

./fn *.JPG

আপনি যে ডিরেক্টরিটিতে আছেন সেখানে এক বছর বিয়োগের মাধ্যমে তারিখটি পরিবর্তন করবে।


1
উপরের মতামত হিসাবে একই। বেশিরভাগ .jpg ফাইলের ক্যামেরা দ্বারা সংযুক্ত মেটা ডেটাতে এম্বেড করা তারিখ থাকবে। এটি কাজ করে (তারিখ রূপান্তর করতে সেড ব্যবহার করে টাচ হ্যান্ডেল করতে পারে): 'টাচ-ডি $ (শনাক্তকরণ-ফর্ম্যাট% [উপস্থিত: তারিখটাইম] $ চ | সেড-র' s /: / / /; এস /: / - / / ; ') $ চ'
গাওথে

-6

শুধুমাত্র সেটিংসে তারিখ এবং সময় পরিবর্তন করুন। তারপরে আপনার ফাইলটি সংরক্ষণ করুন, এটি স্বয়ংক্রিয়ভাবে পরিবর্তিত হবে


3
স্নেজ এমন একটি ব্যাচ বা কমান্ড লাইন সমাধান সন্ধান করছে যা একাধিক ফাইল সংশোধন করতে ব্যবহৃত হতে পারে। সিস্টেমের সময় ও তারিখ পরিবর্তন করা এবং ফাইলগুলি সংশোধন করা সম্ভবত কোনও আদর্শ সমাধান নয়।
ফেব্রিকেটর 4

অনেক বেশি ত্রিয়েইইইকি !!!
ফিলিপ গ্যাচাউদ

ওয়েব অনুসন্ধানের মাধ্যমে অন্যান্য ওএস এর সাথে যারা এনেছেন তাদের জন্য, এই উত্তরটি ম্যাক ওএসএক্স-এ কোনও ফাইলের তারিখ পরিবর্তন করার সহজ উপায় ('স্পর্শ-ডি' 'অবৈধ বিকল্পে "ফলাফল দেয়)।

1
@ এল্যানিং: ওএসএক্সের জিএসইউ টাচ নয়, বিএসডি টাচ রয়েছে। ব্যবহার -t। বিকাশকারী.অ্যাপল.
ডোমিনিক আর

এর অপ্রত্যাশিত পরিণতি হতে পারে। একটি আধুনিক ওএসে, প্রচুর ফাইল সমস্ত সময় পর্দার আড়ালে পরিবর্তিত হয়ে আসছে। আপনার তারিখটি পরিবর্তিত হওয়ার সময়, অন্য অনেকগুলি ফাইল সেগুলিতে ভুল তারিখের ডাকটিকিট পেতে পারে এবং সিস্টেমের অন্য কোনও কিছু যখন লক্ষ্য করে যে কোনও ফাইল প্রত্যাশার চেয়ে পুরানো।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.