سؤال

وأنا أحاول أن أفعل ما أعتقد أنه شيء بسيط لينكس. لدي النصي باش التي تدير برامج الاختبار المختلفة، وأريد أن تحديد وإنشاء ملفات في الدليل الحالي من برامج الاختبار. لذلك أنا أفعل شيئا من هذا القبيل:

touch timestamp-file
run the test
find -newer timestamp-file -type f > list-of-files
rm -f timestamp-file

وتبين مستوى ل-newer اكتشاف والفقراء، وذلك ما يحدث عادة هو أن بعض الملفات التي تم إنشاؤها بواسطة برنامج اختبار تظهر كما أقدم من الملف الطابع الزمني. حتى ذلك الحين حاولت هذه:

ls -tr1 | sed '1,/timestamp-file/d'

ولتوليد نفس القائمة. هذا <م> عادة يعمل، ولكن ليس دائما. ما زلت في نهاية المطاف مع الحالة التي يكون فيها الملفات التي تم إنشاؤها من قبل الاختبار تظهر كما أقدم من الملف الطابع الزمني.

وشكرا!

وP.S. يمكنني تحقيق ذلك بطريقة أخرى عن طريق أخذ اثنين من لقطات من الدليل، واحدة قبل تشغيل برنامج اختبار، وبعد ذلك واحدة بعد، ومقارنتها. أي ملفات في القائمة الثانية التي ليست في الأول يجب أن يكون قد تم إنشاؤها بواسطة برنامج اختبار (لست قلقا مع وظيفة الخلفية أو المستخدمين الآخرين الكتابة إلى دير). ولكن هذه الطريقة ليست ما أريد لأنه إذا لم تتم إزالة ملف إخراج قبل تشغيل الاختبار (انهم من المفترض أن يكون، ولكن في بعض الحالات قد لا يكون)، وهذه الطريقة يقول لم يخلق من قبل برنامج اختبار لأنه كان في دير قبل تشغيل برنامج الاختبار.

هل كانت مفيدة؟

المحلول

وتأخذ أسماء كافة الملفات قبل تشغيل، ولكنها تشمل الطوابع الخاصة:

find -printf '%p %T@\n' | sort > file1

<الفرعية> إذا لم تكن قد حصلت على هذا تجد خيار متاح، يمكنك استخدام القانون الأساسي لهذا المنصب أيضا:

find -print0 | xargs -0 stat -c "%n %Y" | sort > file1

وبعد التشغيل لfile2. ثم استخدم

comm -1 -3 file1 file2

وسوف تظهر لك خطوط فريدة من نوعها لfile2، التي يجب أن تكون ملفات جديدة إذا لم أكن مخطئا. إذا كانت موجودة من قبل، وتعديل الوقت على قد تغيرت، والتي تتخذ الرعاية من قبل ثينغي %T@ (طبع عدد الثواني منذ عام 1970):

[js@HOST2 cpp]$ find -printf '%p %T@\n' | sort > file1
[js@HOST2 cpp]$ echo foo>bar
[js@HOST2 cpp]$ echo foo>baz
[js@HOST2 cpp]$ find -printf '%p %T@\n' | sort > file2
[js@HOST2 cpp]$ comm -1 -3 file1 file2
. 1230947309.0000000000
./bar 1230947308.0000000000
./baz 1230947309.0000000000
./file2 1230947315.0000000000
[js@HOST2 cpp]$ find -printf '%p %T@\n' | sort > file1
[js@HOST2 cpp]$ echo lol>bar
[js@HOST2 cpp]$ find -printf '%p %T@\n' | sort > file2
[js@HOST2 cpp]$ comm -1 -3 file1 file2
./bar 1230947359.0000000000
./file2 1230947362.0000000000
[js@HOST2 cpp]$`

نصائح أخرى

ويمكنك فعلا استخدام اللمس لإجبار الطوابع من كل الملفات الحالية في الدليل لابعد الحدود في الماضي، مثل:

touch -t 200801010000.00 *

إذا كنت تفعل ذلك قبل تشغيل الاختبار الخاصة بك، يجب أن يكون هناك أكثر من الفرق كافية في الوقت ل "find -newer" لاستلامه. إذا كان تحبب دقيقتين، هل يمكن تعيين كافة الملفات الحالية قبل عشر دقائق، وملف الطابع الزمني إلى قبل 5 دقائق، ثم قم بتشغيل الاختبار.

وهكذا يصبح السيناريو الخاص بك:

touch -t (current time - 10 minutes) *
touch -t (current time -  5 minutes) timestamp-file
run the test
find -newer timestamp-file -type f > list-of-files
rm -f timestamp-file

وبفرض أن لديك لائق تثبيت بيرل، يمكنك القيام بما يلي للحصول منذ 5 دقيقة (أو استخدام -600 لمدة 10 دقيقة) في التنسيق الصحيح ل "date -t":

use Date::Manip;
print UnixDate(DateCalc(ParseDateString("now"),"-300"),"%Y%m%d%H%M.%S") . "\n";

إذا، لسبب ما، كنت لا يسمح له بتغيير الطوابع الزمنية، استخدام:

sleep 300
touch timestamp-file
sleep 300
run the test
find -newer timestamp-file -type f > list-of-files
rm -f timestamp-file

والذي له نفس التأثير، ولكن يمنحك عشر دقائق للذهاب تناول القهوة (أو السم لكم الاختيار إذا كنت لا شارب القهوة).

إذا كنت تنظر كيفية تنفيذ find(1) سيكون من الواضح لماذا هذا في بعض الأحيان قد لا تعمل كما هو متوقع. وهنا تلميح:

  $ touch timestamp ; touch newer ; find . -newer timestamp 
  $ rm timestamp newer
  $ touch timestamp ; sleep 1 ; touch newer ; find . -newer timestamp
  .
  ./newer
  $

وfind(1) يحصل على القيم ملف وقت أخر تعديل / ctime / ATIME باستخدام stat(2) استدعاء النظام. وفيما يلي عناصر struct stat من <sys/stat.h> (لينكس):

  time_t    st_atime;   /* time of last access */
  time_t    st_mtime;   /* time of last modification */
  time_t    st_ctime;   /* time of last status change */

في لينكس (وunices عموما) time_t هو عدد صحيح يمثل "ثانية من بداية 1970". لذلك خيرة granuality أن -newer يمكن فهمه هو مجرد ثانية واحدة.

لماذا لا إنشاء دليل مؤقت فيه لتشغيل الاختبارات؟ استخدام اسم القائم على الطابع الزمني على الدليل إلى مساعدة في تتبع التي حدثت النتائج عندما، وببساطة حذف الدليل بأكمله عند الانتهاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top