سؤال كيف يمكنني تغيير تاريخ التعديل / إنشاء الملف؟


هل هناك طريقة لتغيير التاريخ الذي تم فيه تعديل / إنشاء الملف (الذي يظهر في Nautilus أو باستخدام الأمر 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" {} +

هذا النموذج غير ممكن مع الإصدار النسبي لوقت الملف نظرًا لأنه يستخدم shell لتشكيل الوسيطات إلى touch.

بقدر ما يذهب وقت الإنشاء ، فإن معظم أنظمة ملفات Linux لا تتبع هذه القيمة. هناك ctime مرتبطًا بالملفات ، ولكنه يتتبع متى تم تغيير بيانات تعريف الملف آخر مرة. إذا لم يتم تغيير أذونات الملف أبداً ، فقد يحدث الاحتفاظ بوقت الإنشاء ، ولكن هذه مصادفة. يعد تغيير وقت تعديل الملف بشكل صريح بمثابة تغيير للبيانات التعريفية ، وبالتالي سيكون له أيضًا التأثير الجانبي لتحديث ctime.


260
2017-09-22 06:34



للإشارة إلى حالة أبسط عندما تكون جميع الملفات في نفس المجلد: touch -d "2 hours ago" /path/*.txt، فمثلا. - enzotib
أود أيضا أن أضيف أن تغيير ctime غير ممكن بأي طريقة قياسية. - arrange
هل هذا كل POSIX؟ - user1011471
المعلومات حول ctime كوقت تغيير للبيانات الوصفية من POSIX. لا أعرف ما إذا كانت شظايا قذيفة في إجابتي ستعمل مع أدوات shell 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

ستشاهد ">" بعد أن تضغط على enter، exept for the last time -> "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 الأعلام تؤدي إلى نتيجة صحيحة. يتم تعديل تاريخ التعديل ، ولكن تم تغيير تاريخ الوصول وتغييره إلى NOW - Xerus


يمكن أن يشير Touch إلى تاريخ الملف بأكمله من تلقاء نفسه ، ولا حاجة للاتصال به 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 اختيار أسماء الملفات نفسها أكثر أماناولكن باستخدام find -print0 | xargs -0 touch ...  يجب التعامل معها عظم الشخصيات المجنونة مثل الخطوط الجديدة والمسافات وعلامات الاقتباس والخطوط المائلة العكسية في اسم الملف. (PS. حاول عدم استخدام شخصيات مجنونة في أسماء الملفات في المقام الأول).

على سبيل المثال ، للعثور على جميع الملفات في 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. مثلا 'ident -verbose <image> | grep -i date'، 'define -format٪ [exif: DateTime] <image>' قد تظهر '2015: 01: 08 10:19:10' (ليست كل الصور تحتوي على بيانات exif) . يعمل هذا (باستخدام sed لتحويل التاريخ إلى تنسيق اللمس يمكن التعامل معه): "touch -d $ (تحديد -format٪ [exif: DateTime] $ f | sed -r's /: / - /؛ s /: / - / ؛ ') $ f' - gaoithe


لقد مضى وقت طويل منذ أن كتبت أي نوع من برامج 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
2018-01-04 23:28



نفس التعليق أعلاه. معظم ملفات .jpg سيكون لها تاريخ مضمّن في البيانات الوصفية المُدرجة بالكاميرا. يعمل هذا (باستخدام sed لتحويل التاريخ إلى تنسيق اللمس يمكن التعامل معه): "touch -d $ (تحديد -format٪ [exif: DateTime] $ f | sed -r's /: / - /؛ s /: / - / ؛ ') $ f' - gaoithe


فقط قم بتغيير التاريخ والوقت في الإعدادات. ثم احفظ الملف الخاص بك ، فإنه يتغير تلقائيا


-6
2017-11-28 08:37



تبحث Snej عن حل الدفعات أو سطر الأوامر الذي يمكن استخدامه لتعديل ملفات متعددة. قد لا يكون تغيير وقت وتاريخ النظام وتعديل الملفات حلاً مثاليًا. - fabricator4
الكثير من triiiiiiicky! - Philippe Gachoud
بالنسبة لأولئك الذين لديهم نظام تشغيل آخر يتم إحضارهم هنا عبر بحث الويب ، فإن هذه الإجابة هي أبسط طريقة لتغيير تاريخ ملف على Mac OSX (نتائج touch-d) في "خيار غير قانوني"). - alanning
alanning: OSX لديه اتصال BSD ، وليس اتصال جنو. استخدم -t. developer.apple.com/library/mac/documentation/Darwin/Reference/... - Dominik R
قد يكون لذلك عواقب غير متوقعة. في نظام التشغيل الحديث ، يتم تعديل الكثير من الملفات خلف الكواليس طوال الوقت. بينما يتم تغيير التاريخ الخاص بك ، يمكن أن تحصل على العديد من الملفات الأخرى طوابع التاريخ خاطئ عليها ويمكن أن يحدث أي شيء عند وجود شيء آخر في النظام يلاحظ أن الملف أقدم من المتوقع. - Joe