سؤال يونيكس / لينكس البحث والفرز حسب تاريخ التعديل


كيف يمكنني أن أفعل بسيطة find التي من شأنها أن تأمر النتائج من قبل معظم تعديل مؤخرا؟

هنا هو الحالي find أنا أستخدم (أقوم بفك شيل في PHP ، لذلك هذا هو السبب في المتغيرات):

find '$dir' -name '$str'\* -print | head -10

كيف يمكنني الحصول على هذا الطلب من خلال البحث الذي تم تعديله مؤخرًا؟ (لاحظ أنني لا أريد أن أفرز "بعد" البحث ، وإنما ابحث عن النتائج استنادًا إلى ما تم تعديله مؤخرًا.)


108
2018-06-07 18:23


الأصل


github.com/shadkam/recentmost ستفعل ما هو مطلوب - ولكن المرء يحتاج إلى بناء ذلك - user3392225


الأجوبة:


استخدم هذا:

find . -printf "%T@ %Tc %p\n" | sort -n

printf الحجج من man find:

  • %Tk: آخر تعديل لوقت الملف بالتنسيق المحدد بواسطة k.

  • @: الثواني منذ 1 كانون الثاني (يناير) 1970 ، 00:00 بتوقيت جرينتش ، مع جزء كسري.

  • c: التاريخ والجهوية (السبت نوفمبر 04 12:02:33 EST 1989).

  • %p: اسم الملف.


109
2018-02-05 13:31



+1 مفيد جدا ، أول إجابة لهذا وجدت مع إخراج تاريخ قابل للقراءة / مفيدة - Jake N
الأكثر موثوقية (وبسيطة للغاية) حيث يتم منح الوقت لتكون متسلسلة عدديا (لذلك دائما يمكن فرزها بشكل صحيح) ، تشك! - Aquarius Power
لدي هذا الاسم المستعار للعثور على الملفات الأخيرة في بلدي ~/.zshrc: fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; } فإنه بشكل متكرر يعثر على جميع الملفات التي تحتوي على نمط الوسيطة الأولى التي تم تمريرها إلى الأمر (fr <pattern>) وفرزها مع آخرها الأخير. - joelostblom
إلى عن على ISO 8601 تاريخ الانتاج ، واستخدام find . -printf "%T@ %CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n. نظرًا لأنه يتم فرزها بشكل طبيعي ، يمكن أيضًا استخدامها مباشرةً في التصنيف: find . -printf "%CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n - Peter Mortensen


أسهل طريقة هي استخدام zsh ، وذلك بفضل التصفيات الكونية.

print -lr -- $dir/**/$str*(om[1,10])

إذا كان لديك بحث جنو ، اجعله يطبع أوقات تعديل الملف وترتيبه حسب ذلك.

find -type f -printf '%T@ %p\0' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10

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

find -type f -printf '%T@ %p\n' |
sort -k 1nr |
sed 's/^[^ ]* //' | head -n 10

إذا كان لديك بيرل (سأفترض هنا أنه لا توجد خطوط جديدة في أسماء الملفات):

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        @sorted = sort {$_{$a} <=> $_{$b}} keys %_;  # sort by increasing age
        print @sorted[0..9];
    }'

إذا كنت تمتلك بيثون (مع افتراض عدم وجود خطوط جديدة في أسماء الملفات):

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in (sorted(times.iterkeys(), key=lambda f:times[f], reverse=True))[:10]: print f'

ربما هناك طريقة لفعل الشيء نفسه في PHP ، لكنني لا أعرف ذلك.

إذا كنت ترغب في العمل مع أدوات POSIX فقط ، فهذا أكثر تعقيدًا. نرى كيفية سرد الملفات التي تم فرزها حسب تاريخ التعديل بشكل متكرر (لا يوجد أمر قانوني متاح!) (الإبقاء على أول 10 هو الجزء السهل).


80
2018-06-07 18:39



اعتقد ان find يظهر الإصدار أقدم الملفات ، والتي تحتاج إلى إضافة -r خيار ل sort. - Quentin Pradet
سيدتي تقول أنها لا تملك خيار -z. - Kef Schecter
KefSchecter ثم استخدم الخطوط الجديدة كفواصل ، ولكنك ستفقد الدعم للخطوط الجديدة في أسماء الملفات. - Gilles
ما ورد أعلاه هو python2. إذا كان لديك فقط python3 ، بعض التغييرات الصغيرة: python3 -c 'import os، sys؛ times = {} for f in sys.stdin.readlines (): f = f [0: -1]؛ times [f] = os.stat (f) .st_mtime for f in (sorted (times.keys ()، key = lambda f: times [f]، reverse = True)) [: 10]: print (f)؛ ' - Neil McGill


لست بحاجة إلى PHP أو Python ، فقط ليرة سورية:

man ls:
-t     sort by modification time
-r,    reverse order while sorting (--reverse )
-1     list one file per line

find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;

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

  • find . -print0|xargs -0 command      (يُحسّن السرعة ، إذا لم يجد التطبيق "-exec +" ولكن يعرف "-print0")
  • find . -print|xargs command     (إذا لم يكن هناك مساحة بيضاء في الوسيطات)

إذا كان الجزء الرئيسي من الوسيطات يتكون من مسارات طويلة أو مطلقة أو نسبية ، فحاول نقل إجراءاتك إلى الدليل: cd /directory/with/long/path; command * وقد يكون حل سريع آخر مطابقًا لعدد أقل من الحجج: command [a-e]*; command [f-m]*; ... 


32
2018-06-16 18:11



إذا كان هناك الكثير من الملفات ، فهذا يفشل مع "قائمة الوسيطات طويلة جدًا" على ls. - occulus
هذا صحيح ، لكني أعتقد أن السؤال كان "كيف أقوم بإيجاد بسيط ..." - Ярослав Рахматуллин
لا يقتبس ls أسماء الملفات بطريقة يمكن أن يفهمها xargs (لا يوجد خيار -0 ، وأنماط الاقتباس المختلفة غير كافية) - Tobu


ما عليك سوى القيام به ليرة سورية

هل يمكن أن تفعل find /wherever/your/files/hide -type f -exec ls -1rt "{}" +; كما هو مذكور أعلاه،

أو

ls -1rt `find /wherever/your/file/hides -type f`

10
2018-05-18 07:58



إذا كان هناك الكثير من الملفات ، فهذا يفشل مع "قائمة الوسيطات طويلة جدًا" على ls. ربما نتذكر استخدام xargs؟ - occulus
لكن اذا xargs المكالمات ls عدة مرات ، سيتم كسر هذا النوع. - Aaron D. Marasco
هذا فشل للملفات ذات المسافات في أسمائها. اي نصيحه؟ - user74094


تمتد إجابة user195696:

find . -type f -printf "%T@\t%Tc %6k KiB %p\n" | sort -n | cut -f 2-

لكل ملف ، يخرج هذا أولاً الطابع الزمني الرقمي (للفرز ، متبوعًا بالجدولة \t) ، ثم طابع زمني قابل للقراءة من قبل البشر ، ثم الملفات (للأسف findالصورة -printf لا يمكن القيام به في mebibytes ، فقط kibibytes) ، ثم اسم الملف مع المسار النسبي.

ثم sort -n يرتبها بالحقل الرقمي الأول.

ثم cut يتخلص من هذا الحقل الرقمي الأول الذي لا يهم المستخدم. (يطبع الحقل الثاني إلى الأمام.) فاصل الحقل الافتراضي هو \t أو الجدولة.

مثال على الإخراج:

Thu 06 Feb 2014 04:49:14 PM EST     64 KiB ./057_h2_f7_10/h2_f7_10.class
Fri 07 Feb 2014 02:08:30 AM EST 7962976 KiB ./056_h2_f7_400/h2__rh_4e-4.mph
Fri 07 Feb 2014 02:23:24 AM EST 7962976 KiB ./056_h2_f7_400/h2_f7_400_out_Model.mph
Fri 07 Feb 2014 02:23:24 AM EST      0 KiB ./056_h2_f7_400/h2_f7_400_out.mph.status
Fri 07 Feb 2014 02:23:24 AM EST     64 KiB ./056_h2_f7_400/1579678.out
Fri 07 Feb 2014 03:47:31 AM EST 8132224 KiB ./057_h2_f7_10/h2__rh_1e-5.mph
Fri 07 Feb 2014 04:00:49 AM EST 8132224 KiB ./057_h2_f7_10/h2_f7_10_out_Model.mph
Fri 07 Feb 2014 04:00:49 AM EST      0 KiB ./057_h2_f7_10/h2_f7_10_out.mph.status
Fri 07 Feb 2014 04:00:49 AM EST     64 KiB ./057_h2_f7_10/1579679.out
Fri 07 Feb 2014 09:47:18 AM EST   9280 KiB ./056_h2_f7_400/h2__rh_4e-4.mat
Fri 07 Feb 2014 10:51:23 AM EST   9728 KiB ./018_bidomain/h2_plain__rh_1e-5.mat
Fri 07 Feb 2014 10:58:33 AM EST   9568 KiB ./057_h2_f7_10/h2__rh_1e-5.mat
Fri 07 Feb 2014 05:05:38 PM EST     64 KiB ./058_h2_f7_stationary/h2_f7_stationary.java
Fri 07 Feb 2014 06:06:29 PM EST     32 KiB ./058_h2_f7_stationary/slurm.slurm
Sat 08 Feb 2014 03:42:07 AM EST      0 KiB ./058_h2_f7_stationary/1581061.err
Sat 08 Feb 2014 03:42:14 AM EST     64 KiB ./058_h2_f7_stationary/h2_f7_stationary.class
Sat 08 Feb 2014 03:58:28 AM EST  70016 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mph
Sat 08 Feb 2014 04:12:40 AM EST  70304 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mph
Sat 08 Feb 2014 04:12:53 AM EST  70304 KiB ./058_h2_f7_stationary/h2_f7_stationary_out_Model.mph
Sat 08 Feb 2014 04:12:53 AM EST      0 KiB ./058_h2_f7_stationary/h2_f7_stationary_out.mph.status
Sat 08 Feb 2014 04:12:53 AM EST     32 KiB ./058_h2_f7_stationary/1581061.out
Mon 10 Feb 2014 11:40:54 AM EST    224 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mat
Mon 10 Feb 2014 11:42:32 AM EST    224 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mat
Mon 10 Feb 2014 11:50:08 AM EST     32 KiB ./plot_grid.m

لقد قمت بعمل حقل 6 حقول بشكل متعمد ، لأنه إذا جعلته أطول ، يصبح من الصعب التمييز بصريًا بين حجم الملفات. بهذه الطريقة ، الملفات الأكبر من 1E6 KiB jut out: تعني كلمة char 1 1-9 جيجابايت ، ب 2 حرف يعني 10-99 جيجابايت ، إلخ.


تحرير: هنا نسخة أخرى (منذ ذلك الحين find . -printf "%Tc" تعطل على MinGW / MSYS):

find . -type f -printf "%T@\t%p\n" | sort -n | cut -f 2- | xargs -I{} ls -Glath --si {}

اعطاء الانتاج مثل:

-rw-r--r-- 1 es 23K Jul 10  2010 ./laptop_0000071.jpg
-rw-r--r-- 1 es 43M Jul 29 19:19 ./work.xcf
-rw-r--r-- 1 es 87K Jul 29 20:11 ./patent_lamps/US Patent 274427 Maxim Lamp Holder.jpg
-rw-r--r-- 1 es 151K Jul 29 20:12 ./patent_lamps/Edison screw-in socket.png
-rw-r--r-- 1 es 50K Jul 29 20:13 ./patent_lamps/1157 Lamp.jpg
-rw-r--r-- 1 es 38K Jul 29 20:14 ./patent_lamps/US06919684-20050719-D00001.png

أين:

  • -I{} يسبب حدوث {} ليحل محلها حجة ، و أصبحت newlines الآن فواصل الحجة (لاحظ المسافات في أسماء الملفات أعلاه).

  • ls -G يمنع طباعة اسم المجموعة (نفايات الفضاء).

  • ls -h --si تنتج أحجام الملفات التي يمكن قراءتها من البشر (أكثر صحة مع --si).

  • ls -t حسب الوقت ، وهو أمر غير ذي صلة هنا ، ولكن هذا ما استخدمه عادة.


3
2018-04-24 08:12



ملاحظة: للفرز حسب الملف بحجم بدلا من ذلك ، ببساطة استبدال T@ بواسطة s في أي من الأوامر المذكورة أعلاه. - Evgeni Sergeev


OS X variant من @ user195696's answer:

  1. مع الطابع الزمني:

    find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r
    
  2. بدون الطابع الزمني:

    find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r | awk -F' ' '{ print substr($0, length($1) + 2) }'
    

2
2018-02-24 15:18





لقد وجدت أن هذا ينجز المهمة على نظام التشغيل Mac OS X (وعمومي بما يكفي للعمل على Unixen أخرى أيضًا):

find . -type f -ls | awk '{print $(NF-3), $(NF-2), $(NF-1), $NF}' | sort

1
2017-07-26 07:42



للأسف ، هذا يطبع أسماء شهرية محلية على الإعداد الكرواتي ، مما يجعل من نوع غير صحيح. - Ivan Vučica
إجابة user195696 يعمل للإعداد الكرواتي (وغيرها). - Peter Mortensen


إذا كان لديك find الاختيار بسيط جدا ، قد تكون قادرا على الاستغناء عنه ، واستخدامه فقط ls:

ls -1 *.cc # -r -t optional

1
2018-05-02 11:16





استعمال:

find . -type f -mtime 0 -printf "[%TD %TI:%TM%Tp] %s %p\n" | sort -n | awk '{
    hum[1024**4]="TB"; hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; hum[0]="B";
    for (x=1024**4; x>=1024; x/=1024){
    if ($3>=x) { printf $1" "$2"\t%7.2f %s\t%s\n",$3/x,hum[x],$4;break }
    }}';

سيقوم هذا الأمر بفرز الملفات حسب تاريخ التعديل.

وعرض مثل:

[12/05/13 03:10PM] 1.75 MB ./file.text
[12/06/13 11:52PM] 2.90 MB ./file2.mp4
[12/07/13 04:11PM] 4.88 MB ./file3.mp4
[12/07/13 09:17PM] 4.74 MB ./test.apk

1
2017-12-08 09:14



لقد قمت بتحسين هذا البرنامج النصي للتعامل مع المسافة البيضاء في أسماء الملفات ، انظر superuser.com/a/777007/134532 - jan


لا اعتقد find لديه أي خيارات لتعديل ترتيب الإخراج. -mtime و -mmin سيتيح لك تقييد النتائج على الملفات التي تم تعديلها خلال فترة زمنية معينة ، ولكن لن يتم فرز المخرجات - يجب عليك القيام بذلك بنفسك. GNU find لديه -printf الخيار ، من بين أشياء أخرى ، سيسمح لك بطباعة وقت التعديل لكل ملف يتم العثور عليه (تنسيق السلاسل %t أو %Tk) التي قد تساعدك على فرز find خرج بالطريقة التي تريدها.


0
2018-06-07 18:33