سؤال كيفية فرز الدلائل أولاً ثم الملفات إلخ ... عند استخدام "ls" في Unix


أود استخدام ls الأمر أولاً إظهار الدلائل ثم الملفات. حاولت:

ls -la | sort -k 1

لكنني حصلت على أمر خاطئ.


77
2018-02-16 13:13


الأصل


انه بسبب - يأتي قبل d عند استخدام sort - Nifle
تستخدم رؤوس unix القديمة (التي تنتمي إلى عصر واجهة المستخدم الرسومية المسبق) للاستفادة من أسماء المجلدات الخاصة بها وجعل أسماء الملفات البسيطة غير مستخدمة للحصول على تلك النتيجة تلقائيًا. - JRobert
سؤال مفيد! ربما حان الوقت لتغيير الإجابة المقبولة على واحدة أبسط ولا تكسر الألوان النهائية؟ - ippi


الأجوبة:


سيقوم الأمر التالي بسرد الدلائل أولاً ، والملفات العادية الثانية ، والارتباطات الثالثة.

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

أيضا ، من شأنه أن يجعل قدرا كبيرا من معنى لخلق الاسم المستعار لهذا الأمر لحفظ ضربات المفاتيح.

تصحيح:

إذا كنت تريد الدلائل أولاً ، ثم كل ما هو غير دليل الثاني ، استخدم هذا:

ls -la | grep "^d" && ls -la | grep -v "^d"


25
2018-02-16 13:36



لا يسرد هذا الأمر كل شيء إذا كان هناك ، على سبيل المثال ، مآخذ توصيل أو FIFOs في المجلد - Studer
يجب أن تعمل تلك النسخة المحررة مع أنواع أخرى. يقول grep الأول كل شيء يبدأ بـ 'd' ، والثاني يقول كل شيء لا يبدأ بـ 'd'. من المؤكد أن كل شيء يبدأ بـ d أو لا ، أليس كذلك؟ - Ry4an Brase
@ مارك - لماذا لا تفعل فقط: ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"؟ - FCTW
لجعل الأمر FCTW @ الاسم المستعار OSX ، إضافة هذا إلى ~ /. ملف التعريف الخاص بك: alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\"" - aliteralmind
لقد وجدت تدوينًا مختصرًا للعمل: ls -la|grep ^d;ls -la|grep -v ^d (اقتباسات غير مطلوبة واستبدالها && مع ;). خيار آخر هو إدخال متغير ثم تقييمه: a="ls -la|grep ^d";eval $a;eval $a -v. قد يكون من المفيد تجنب التكرار عند تحديد المزيد من الخيارات ls/grep. هناك أيضا ذلك ls -la --group-directories-first الخيار ، ولكن أقصر ايمو هو ls -la|sort - Steven Pribilinskiy


أنا أحب ذلك * لا شىء وحب رؤية الإبداع الذي يدخل في بعض هذه الردود ...

لا يقترب من مين على حد سواء في غنو لينكس:

alias ls='ls --color -h --group-directories-first'

بالنظر إلى أنني أشعر براحة أكبر مع تطبيقات واجهة سطر الأوامر CLI الخاصة بي ، فإنني أميل إلى تحديث النواة أيضا على OSX:

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'

181
2018-02-16 13:47



للأسف ، هذا لا يعمل على محطة osx ، حيث - الخيار غير متوفر. - MEM
إعادة الحب: هل تلك السخرية؟ إذا كان الأمر كذلك ، فما استقاموا لكم فاستقيموا؟ - allyourcode
رد: لا يعمل على ماك ... صحيح بما فيه الكفاية ، شخصيا على الرغم من أنني عموما القيام بتثبيت نواة الأساسية لتجاوز mac builtins لمستخدمي المحلية. - jonathanserafini
الغرض من الاسم المستعار ls هو تعريف عناصر التكوين التي أريد استخدامها 90٪ من الوقت. أقل ضغطات المفاتيح لتحقيق الإخراج المطلوب. إذا كنت ترغب في الحصول على إخراج ls الأصلي يمكنك دائمًا / bin / ls. - jonathanserafini
MEM إذا كنت تستخدم نظام التشغيل OS X وكنت تستمتع باستخدام Terminal ، فيجب عليك ذلك brew install bash  ثم ، هذا سوف يعمل! :) - Andrew Ashbacher


لمستخدمي ماك coreutils:

brew install coreutils

alias ls='ls --color -h --group-directories-first'

بافتراض أن نظامك جاهز البيرة:


16
2018-06-13 17:01



gls بدلا. حق؟ - Paul Irish
نعم ، بشكل افتراضي. يمكنك أيضًا استخدام النواة بشكل افتراضي مع PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH". - benesch


لديك عدة خيارات ، حسب ما إذا كنت تريد الاحتفاظ بالترتيب الأبجدي.

يمكنك ببساطة محاولة:

ls -al | sort -k1 -r

أو هذا ، للحفاظ على الترتيب الأبجدي للملفات التي لها نفس الأذونات:

ls -al | sort -k1،1 -k9،9 -r

أو ، كما قال eleven81 (ولكن هذا الإصدار يسرد كل شيء):

ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"


6
2018-02-16 14:28



هذا هو حل أجمل المنظمة البحرية الدولية. إن استخدام العديد من العمليات والأنابيب للقيام بالفرز بدلاً من الأنابيب إلى الفرز يبدو وكأنه نوع من التراجع. خصوصا منذ ذلك الحين ls- al|sort -k1 -r يعمل. ما هو مفقود هو فقط -r العلم. - brice
brice الشيء الذي يزعجني حول "نوع" هو ذلك ./ و ../ لن يكون أول سطرين ، بهذا الترتيب. بخلاف ذلك ، أوافق على أنه الحل الأكثر فعالية. - thdoan


إلى وdelerious010 سأضيف أنه إذا كنت تريد طلبًا قديمًا:

LANG=C ls -la --group-directories-first

(أو استخدام LC_ALL أو LANGUAGE أو LC_COLLATE لتعيين "C").

سيعطي هذا شيئًا مماثلاً لما يلي:

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file

على الرغم من ذلك ، إذا كنت أذكر بشكل صحيح ، ظهرت ملفات النقطة المخفية في الأصل قبل الدلائل.


5
2018-02-16 14:56





هناك أشياء معينة أريد رؤيتها في قائمة الدليل ، وحتى الآن لا توجد إجابات للإجابات هنا تفي بجميع المتطلبات أدناه. متطلباتي في قائمة الدليل:

  1. يتم فرز الدلائل والملفات حسب الترتيب الأبجدي
  2. يتم سرد الدلائل أولا
  3. يتم فرز الروابط الرمزية (symlinks) مثل الملفات
  4. الفرز غير حساس لحالة الأحرف
  5. يتجاهل الفرز جميع أحرف غير ألفا الرائدة في اسم الملف
  6. تتضمن القائمة العدد الإجمالي للأدلة (باستثناء ./ و ../) والملفات والروابط
  7. تتضمن القائمة الحجم الإجمالي (استخدام القرص) من الدلائل والملفات
  8. يجب أن تبدو القائمة نفسها على لينكس وويندوز (Git Bash shell) - كان هذا هو الأصعب للحصول على حق منذ خيارات مريحة مثل --group-directories-first لا تعمل في Git Bash لـ Windows

بعد الكثير من الاختراق ، خرجت أخيرا بخط واحد (وإن كان خط طويل جدا ؛-)) أنني راض. لقد عيّنت هذا لاسم مستعار اسمه "dir":

ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" | 
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" | 
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . | 
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f | 
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | 
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)

لتسهيل الأمور ، توصلت إلى أوامر منفصلة لإخراج كل جزء من قائمة الدليل حسب رغبتي ، ثم جمّعها معًا باستخدام && المشغل أو العامل.

  • ls -dlF --color * .* | head -n2 -- استخراج ./ و ../. نحن لا نريد أن تمر من خلال هذه sort لأنهم بالفعل في الترتيب الصحيح ، ويمكن أن يؤدي ترتيبهم إلى ../ يجري سردها أولا. ال -dالخيار هو التخلص من سطر "الإجمالي". أنا أحب أن أضيف -F لإظهار شرطة مائلة للأدلة (سيحدد أيضًا symlinks بـ "@" عند القيام بواجهة عادية ls -F).

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df - استخرج الأدلة وفرزها حسب اسم الملف (العمود التاسع) ، متجاهلين الأحرف غير الألفا / الفراغات (d الخيار) وحالة الأحرف (f اختيار). ال ls -A الخيار يستثني ./ و ../ من القائمة منذ أن استخرجناها بالفعل في الخطوة السابقة. أنا أميل إلى بادئة كل شيء grep و sort الأوامر مع LC_ALL=C إعادة تعيين الإعدادات المحلية بحيث يكون (1) الإخراج متناسقاً عبر shell Unix ، و (2) يمكنك أحياناً رؤية أداء أسرع لأنه لم يعد لديك مقدار الحمل لمجموعة أحرف UTF-8 الثقيلة للتعامل معها.

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df - هذا مشابه للخطوة أعلاه ، لكننا نقوم في هذه المرة بفرز الملفات والارتباطات الصوتية.

  • find -maxdepth 1 -type d ! -name . | wc -l - احصل على عدد من الدلائل ، باستثناء ./ و ../.

  • find -maxdepth 1 -type f | wc -l - احصل على عدد الملفات.

  • find -maxdepth 1 -type l | wc -l - احصل على عدد من الروابط.

  • du -hs | cut -f 1 - استخراج الحجم الإجمالي لجميع الأدلة الفرعية في شكل قابل للقراءة.

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 - استخراج الحجم الإجمالي لجميع الملفات في شكل قابل للقراءة.

دعونا نرى الجديد لدينا dir الاسم المستعار في العمل!

قبل:

$ ls -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/

بعد:

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)

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


تحديث

كان الاسم المستعار أعلاه بطيئًا بشكل مؤلم عند تنفيذه من الدليل الجذر لنظام ملفات عميق ، لذلك قمت بتحديث هذا الأمر البسيط ولكن الأكثر أداء:

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

إخراج العينة:

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes

منذ يدعم الإصدار الجديد من Git Bash لـ Windows --group-directories-first، لم نعد بحاجة للتراجع sort. على الرغم من أن الاسم المستعار الجديد لا يعرض الكثير من المعلومات مثل الاسم المستعار السابق ، إلا أن المكاسب في الأداء أكثر من قيمتها. كعلامة ، يمكنك أيضا الحصول على الألوان!


4
2017-10-24 20:07



جواب رائع! لكن عندما تقول "بعد الاختراق كثيرًا ، توصلت أخيراً إلى بطانة واحدة ..." نعم ، في الواقع هذا ليس حقا "بطانة واحدة" بالمعنى الكلاسيكي. قد يكون من المنطقي أخذ هذا المنطق وجعله نصًا شيلاريًا مستقلًا وتشغيله فقط أو تسميته كاسم مستعار. - JakeGould
تضمين التغريدة ردًا علىJakeGould لم أنتهي حتى من قراءة إجابتي حتى الآن وأنت قد انتهيت من قراءتها وإطلاق تعليق :). نعم ، إنه مرشح رئيسي لوظيفة ، لكنني كنت كسولًا جدًا في ذلك الوقت ، لذلك ألقيته في ملفي .bash_aliases. من ناحية أخرى ، عادة ما أكتب وظيفة فقط عندما لا أستطيع القيام بشيء ما دون تمرير المعلمات. - thdoan
@ 10basetom: سؤال سريع: كيف يمكنك الحصول على ألوان مختلفة للأعمدة في ls؟ أستطيع اللون أسماء الملفات بواسطة filetype باستخدام ls --color ، ولكن لا أرى طريقة للحصول على تلك الألوان المفيدة للأعمدة. ما هو السر؟ - Pirx
Pirx وأعتقد أن يتم تلوين الأعمدة عن طريق تسليط الضوء على بناء الجملة المكدس الافتراضية :-). - thdoan
نعم ، يبدو أن هذا هو الحال ، لكنها فكرة رائعة ، والحلول في ؛-) - Pirx


إليك وظيفة للقيام بذلك (bash أو zsh): و ... أنا لا أقترح أن هذه هي أفضل طريقة ، لكنها الطريقة التي توصلت إليها وأستخدمها الآن:

وظيفة LSS
{
    # يعرض قائمة الدليل مع الدلائل في الجزء العلوي.

    الأمر ls --color = always $ @ | egrep '^ d | total'
    الأمر ls --color = always $ @ | egrep -v '^ d | total'؛
}

2
2018-02-16 13:37



مجرد fyi هذا لا يبدو للعمل. تحتاج إلى استخدام تنسيق قائمة طويلة (ls -l) من أجل التصفية حسب نوع الملف مثل هذا. أيضا ، فإن هذا الأمر سوف يكسر المساحات (في bash). عليك أن تقتبس مثل: "$@" إذا كنت ترغب في استخدام هذا الأسلوب ، فيمكنك القيام بشيء مثل: function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"} - Six


طريق اخر ...

find . -d 1 -type d | ls -la | sort -r 

أو

ls -la | sort -r

أو

d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"

1
2018-06-08 09:57



ماذا تفعل هذه؟ أين تعلمت كتابتها؟ - Tom Wijsman
حسنا بلدي المفضل هو نظام التشغيل ديبيان لينكس. تدعم حزمة gnu الأساسية لـ Debian إصدار حزمة ls - الخيار -showories-first ... عندما بدأت في استخدام OSX قمت ببساطة بسحب كل ملفاتي في bash dot من مربع Debian الخاص بي وأسقطتها في دليل منزلي ... I كان لديك الكثير من bash_aliases التي اندلعت ذلك ... وكان ذلك بعد ذلك كان علي أن أفعل بعض العمل لأحيائي الأسماء المستعارة ... - Eddie B
أول واحد هو زائدة قليلا ... ليس هناك حقا سبب لفرز للأدلة كما هو الترتيب الذي نحتاجه لتعديل لا الدلائل ... و 'ls -la | نوع -r "هو ما يعمل حقا. أساسا أنها تفيد ... 1) أ) البحث. -d 1 -pepe d (ابدأ من هذا الدليل ، ابحث في عمق دليل واحد وابحث عن الأدلة فقط) B) ls -la (list list all attributes) C) رتبها في الاتجاه المعاكس 2) اعمل كـ 1) فقط أسقط البحث. .. ليست هناك حاجة ... أنا في الواقع أحب حل Studers أفضل ... :-) - Eddie B


ls -laX سوف تظهر لك الأدلة أولاً بالترتيب الأبجدي ، ولكن سوف المسمار قائمة الملفات.

خيارات طويلة:

ls
    -l    # List
    --all
    -X    # Sort alphabetically by entry extension

1
2018-02-16 13:31



هذا من شأنه أن يعمل فقط إذا كنت يمكن أن تكون على يقين تام من أن كل دليل ليس لديه نقاط في اسمه. - eleven81


TL، DR

alias ls='ls -lhF --color'

list_sorted() {
    ls $* | grep "^d";
    ls $* | grep "^-";
    ls $* | grep -v -E "^d|^-|^total"
}

alias ll=list_sorted

تفسير

أستخدم مزيجًا من الحلول المقدمة في الإجابات والتعليقات هنا.

افتراضي ls

بادئ ذي بدء ، أنا أقوم بالكتابة فوق السلوك الافتراضي لـ ls:

  • -l: عرض القائمة دومًا كقائمة رأسية أحادية البعد
  • -h: عرض أحجام الملفات في انسان قارئ أزياء (على سبيل المثال 4.0K بدلاً من 4096)
  • -F: مؤشرات العرض مثل شرطة مائلة لاحقة للدلائل
alias ls='ls -lhF --color'

وسعوا ll

بعد ذلك ، أكتب دالة تحتوي على منطق الفرز. لكل ls أنا تمرير أي الحجج التي مرت في الأصل إليها. يمكّنني هذا من استخدام الاسم المستعار من دليل عمل مختلف عن الذي أريد سرده (بمعنى ls -a ~).

أيضا ، كل دعوة ل ls هو piped ل grep أمر. هنا ، يحدث الفرز. ls -l | grep "^d" على سبيل المثال فقط يسرد الدلائل. إذا كان يجب إدراج الدلائل أولاً ، يجب أن يأتي هذا أولاً في الوظيفة أيضًا. الشيء التالي هو الملفات.

وأخيرًا ، أقوم بعرض كل شيء ليس دليلاً ولا ملفًا (ولا السطر الذي يعرض الحجم الإجمالي لمحتويات الدليل). يتم ذلك عن طريق grepping directoy، إدخالات ملف عادية وإدخال الكلي ومن ثم عكس النتيجة عبر -v جدال.

list_sorted() {
    # List directories
    ls $* | grep "^d";
    # List regular files
    ls $* | grep "^-";
    # List everything else (e.g. symbolic links)
    ls $* | grep -v -E "^d|^-|^total"
}

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

alias ll=list_sorted

ملاحظات

  • أنا أستعمل ; بدلا من && كمحدد للأوامر. بخلاف ذلك ، يتعذر على المرء سرد محتويات الدلائل التي لا تحتوي على أدلة (يتم تقييم الأمر ls الأول إلى false ، وبالتالي لا يسمح بتنفيذ الأمر التالي نظرًا لأنه يترافق مع &&. ; يتجنب ذلك.)

1
2018-06-22 06:43