سؤال

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

LS -LA |. AWK {"طباعة 6 دولارات، 7 دولارات، 8 دولارات، 9 دولارات، 10 دولارات '} | Grep "ديسمبر" | فرز |. رئيس -5 ديسمبر 4 20:15 مجلد / ديسمبر 4 19:51. / ديسمبر 4 17:42 مجلد  John / dec 4 16:19 الواجبات المنزلية  حصيرة  08/08 / ديسمبر 4 16:05 مجلد  سميث /

إلخ..

كيف يمكنني إعداد شيء مثل تعبير منتظم لا يشمل أشياء مثل "./" و ".. /"،

أيضا كيف يمكنني حذف مائل "" للمجلدات التي لها مسافات فيها. معرف ترغب في إسقاط مائل في النهاية. هل هذا ممكن من خلال أمر قذيفة؟ أو هل يجب علي استخدام بيرل لإجراء تعديلات على الاختبار؟ أريد أن يظل التاريخ والوقت كما هو. أي مساعدة سيكون موضع تقدير كبير!

يحتوي المربع Linux ويتم ذلك عبر SSH.

تعديل:

هيريس ما لدي حتى الآن (بفضل علامة و gbacon لهذا)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5

أنا فقط تواجه مشكلة مع استبدال "" مع مجرد مساحة "". بخلاف ذلك شكرا لجميع المساعدة حتى هذه النقطة!

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

المحلول

يمكنك استخدام find للقيام بمعظم العمل من أجلك:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r

لا يتم تضمين الدليل الأصل (..) بشكل افتراضي. ال -mindepth 1 تخلص من الدليل الحالي (.). يمكنك إزالة -maxdepth 1 لجعلها متكررة، ولكن يجب عليك تغيير %f ل %p لتضمين المسار مع اسم الملف.

هذه هي الحقول في -printf:

  • ٪ السل - اسم شهر قصير
  • ٪ TD - يوم من الشهر
  • ٪ TM:٪ TM - ساعات والدقائق
  • ٪ F - اسم الملف

في ال grep لقد أضفت مباراة لبداية الخط، لذلك لن تتطابق مع ملف يسمى "عشري" تم تعديله في نوفمبر، على سبيل المثال.

نصائح أخرى

تحقق وتأكد من أن الأمر "LS" ليس مستعثا بشيء آخر. عادة، لا يمنحك "RAW" LS الدلائل / للحصول على الدلائل، ولا ينبغي أن يهرب من المساحات.

من الواضح أن هناك شيء ما هو الهروب من المساحات لك لطباعة تلك الملفات الخاصة بك، لأن AWK يميل إلى كسر الحقل عن طريق Whitespace، وهذا ما هي "الأحرف" ل.

المسافات هي مصممة أسماء الملفات خصيصا لإحباط الكتابة سهلة البرنامج النصي و Mashups مثل أنت تحاول القيام به هنا.

يمكنك تصفية إخراج ls:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5

إذا كنت محتوى لاستخدام Perl:

ls -la | perl -lane 's/\\ / /g;
                     print "@F[5..9]"
                       if $F[8] !~ m!^..?/?$! &&
                          $F[5] eq "Dec"'

إليك واحدة من إجاباتك:

كيف يمكنني إعداد شيء مثل تعبير منتظم لا يشمل أشياء مثل "./" و ".. /"،

يستخدم ls -lA بدلاً من ls -la.

بدلا من طباعة عدد ثابت من الأعمدة، يمكنك طباعة كل شيء من العمود 6 T نهاية السطر:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '

لا أحصل على أماكن خلسة، لذلك لا أعرف لماذا تحصل عليه. لإصلاحه يمكنك إضافة هذا:

| sed 's/\\//g'

ما هو مع كل Greps ويديدس ؟؟

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'

حسنا يمكنك إسقاط . و .. بإضافة grep -v "\." | grep -v "\.\."

لست واثق من البقية

انها حقا تزعجني لرؤية خطوط الأنابيب مع awk و grep / sed. AWK هي أداة قوية جدا لمعالجة الخط.

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top