Unix'te “ls” kullanılırken ilk dizinler nasıl sıralanır, dosyalar vb…


91

lsÖnce dizinleri sonra da dosyaları göstermek için bu komutu kullanmak istiyorum . Denedim:

ls -la | sort -k 1

Ama yanlış bir sipariş aldım.


çünkü kullanmadan -önce gelirdsort
Nifle

4
Eski zamanlardaki unix kafaları (GUI öncesi olanlardan), klasör adlarını büyük harf yapmak için kullandılar ve bu sonucu otomatik olarak almak için düz dosya adlarını büyük harf kullandılar.
JRobert

Yararlı soru! Belki de kabul edilen cevabı, daha basit olan ve terminal renklerini bozmayan bir cevabı değiştirme zamanı gelmiştir?
ippi

Deneyinls -lh --group-directories-first
Diogo

Yanıtlar:


28

Aşağıdaki komut ilk önce dizinleri, sıradan dosyaları ikinci ve üçüncü bağlantıları listeler.

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

Ayrıca, bu komut için tuş vuruşlarını korumak üzere bir takma ad oluşturmak çok mantıklı olacaktır .

Düzenle:

Önce dizinleri, sonra da ikinci bir dizin olmayan her şeyi istiyorsanız, şunu kullanın:

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


1
Bu komut, örneğin klasörde soketler veya FIFOlar varsa, her şeyi listelemez
Studer,

1
Bu düzenlenmiş sürüm hala diğer tiplerle çalışmalıdır. İlk grep, 'd' ile başlayan her şeyi, ikincisi ise 'd' ile başlamayan her şeyi söylüyor. Elbette her şey ya reklamla başlar ya da başlamaz, değil mi?
Ry4an Brase

1
@ Mark - Neden sadece yapamaz: ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"?
FCTW

1
@ FCTW'nin komutunu bir OSX takma adı yapmak için, bunu ~ / .profile komutunuza ekleyin:alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind

2
Ben çalışan bir kısa gösterimi bulduk: ls -la|grep ^d;ls -la|grep -v ^d(tırnak gerekli ve değiştirilmez &&ile ;). Başka bir seçenek bir değişken tanıtmak ve daha sonra değerlendirmektir: a="ls -la|grep ^d";eval $a;eval $a -v. Çok fazla seçenek için belirtildiğinde tekrarlardan kaçınmak için yararlı olabilir ls/ ' grep. Bu ls -la --group-directories-firstseçenek de var , ancak en kısa imols -la|sort
Steven Pribilinskiy

204

Öyle yapıyorum * aşk * ve bu cevapların bazılarına giren yaratıcılığı görmeyi seviyorum ...

Benimki GNU Linux'ta neredeyse hiç de fantazi değil:

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

Linux CLI uygulamalarımda daha rahat olduğum için OSX'deki coreutils'i de güncelleme eğilimindeyim:

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

6
ne yazık ki, bu osx terminalinde çalışmıyor çünkü - seçenek mevcut değil.
MEM

7
yeniden aşk: Bu iğneleme mi? Eğer öyleyse, katılıyorum.
allyourcode

4
Diğer adın amacı, zamanın% 90'ını kullanmak istediğim yapılandırma öğelerini tanımlamaktır. İstenilen çıktıyı elde etmek için daha az tuşa basılması. Hiç bir zaman yerel ls çıktısına sahip olmak istemezseniz her zaman / bin / ls olabilir.
jonathanserafini

4
@MEM OS X kullanıyorsanız ve Terminal'i kullanmaktan zevk alıyorsanız brew install bash , o zaman çalışmalısınız! :)
Andrew Ashbacher,

5
Bence: Tam olarak hedefe ulaşmak için bir komut satırı seçeneği yerine grep vb.lerine bir dolambaçlı kümesi listelenir olarak bu kabul cevap olmalıydı
Ryan Griggs

17

Mac kullanıcıları için coreutils :

brew install coreutils

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

Sisteminizin homebrew hazır olduğunu varsayarsak :


7
glsdaha doğrusu. Sağ?
Paul Irish

1
Evet, varsayılan olarak. Coreutils'i varsayılan olarak da kullanabilirsiniz PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH".
benesch

7

Bir rehber listesinde görmek istediğim bazı şeyler var ve şu ana kadarki cevapların hiçbiri aşağıdaki şartları yerine getirmiyor. Bir dizin listesi için gereksinimlerim:

  1. Dizinler ve dosyalar alfabetik olarak sıralanır
  2. İlk önce dizinler listelenir
  3. Sembolik bağlantılar (sembolik bağlantılar) dosyalar gibi sıralanır
  4. Sıralama büyük / küçük harf duyarlı değildir
  5. Sıralama, bir dosya adındaki tüm önde gelen alfa olmayan karakterleri yoksayar
  6. Liste, toplam dizin sayısını ( ./ve hariç ../), dosyaları ve bağlantıları içerir
  7. Liste, dizinlerin ve dosyaların toplam boyutunu (disk kullanımı) içerir
  8. Giriş, Linux ve Windows'ta da aynı şekilde görünmek zorunda (Git Bash kabuğu) - bu en zor yoldu, çünkü --group-directories-firstWindows için Git Bash'te çalışmayan gibi uygun seçenekler

Çok fazla hacklendikten sonra nihayet memnun olduğum tek bir gömlek (çok uzun bir çizgi de olsa ;-)) ile geldim. Bunu 'dir' adlı bir diğer adaya atadım:

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\)

İşlerin daha kolay yönetilmesini sağlamak için, dizin listesinin her bir bölümünü kendi isteğime çıkarmak için ayrı komutlar verdim, sonra &&operatörü kullanarak bunları birleştirdim .

  • ls -dlF --color * .* | head -n2- ./ve ayıklayın ../. Bunları geçmek istemiyoruz, sortçünkü zaten doğru sıradalar ve bunları sıralama ../ilk sırada listelenmesine neden olabilir . -dSeçenek "toplam" çizginin kurtulmak için; -FDizinler için sondaki eğik çizgiyi göstermeyi de eklemek isterim (düz bir işlem yaptığınızda "@" ile sembolik işaretleri de işaretler ls -F).

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df- Dizinleri ayıklayın ve alfa / boşluk olmayan karakterleri ( dseçenek) ve karakter büyüklüğünü ( fseçenek) yok sayarak dosya adına göre (9. sütun) sıralayın . ls -AOpsiyon dışlayan ./ve ../listeden zaten önceki adımda onları çıkarılan beri. Tümünü önekleme eğilimindeyim grepve yerel sıfırlama sortkomutları ile LC_ALL=C(1) çıktı Unix kabukları arasında tutarlı olacak ve (2) bazen ağır UTF-8 karakterinin yüküne ayarlanmadığı için daha hızlı performans görebilirsiniz uğraşmak.

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df - Bu yukarıdaki adıma benzer, ancak bu sefer dosyaları ve sembolik bağlantıları sıralıyoruz.

  • find -maxdepth 1 -type d ! -name . | wc -l- ./ve hariç, dizin sayısını al ../.

  • find -maxdepth 1 -type f | wc -l - Dosya sayısını al.

  • find -maxdepth 1 -type l | wc -l - Symlinks sayısını al.

  • du -hs | cut -f 1 - Tüm alt dizinlerin toplam boyutunu insan tarafından okunabilir biçimde çıkarın.

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 - Tüm dosyaların toplam boyutunu insan tarafından okunabilir biçimde çıkarın.

Yeni dirtakma adımızı çalışırken görelim !

ÖNCE:

$ 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/

SONRA:

$ 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)

Küçük bir dezavantajı, renkli listelerinizin olmamasıdır; çünkü dosya adlarını çevreleyen renk kontrol karakterleri, sıralamayı çok güvenilmez hale getirir.


GÜNCELLEME

Yukarıdaki takma ad, derin bir dosya sisteminin kök dizininden çalıştırıldığında acı verici bir şekilde yavaştı, bu yüzden daha basit ancak çok daha fazla performans gösteren komut için güncelleme yaptım:

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

Örnek çıktı:

$ 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

Windows için Git Bash'in yeni versiyonunu desteklediğinden --group-directories-first, artık geri adım atmamız gerekmiyor sort. Yeni takma ad önceki takma ad kadar bilgi göstermese de, performans kazanımları buna değer. Bir perk olarak, aynı zamanda renkler olsun!


Mükemmel cevap! Ancak, “Çok fazla hacklendikten sonra sonunda bir astarla geldim…” dediğinizde, Evet, bu gerçekten klasik anlamda bir “tek astar” değildir. Bu mantığı alıp bağımsız bir kabuk betiği haline getirmek ve onu çalıştırmak veya takma ad olarak adlandırmak mantıklı olabilir.
JakeGould

@JakeGould Hızlısın! Henüz cevabımı ispat okumamı bile bitirmedim ve siz zaten okumayı bitirdiniz ve bir yorum yaptınız :). Evet, bir fonksiyon için birinci sınıf bir aday, ama o zamanlar çok tembeldim, bu yüzden .bash_aliases dosyama attı. Öte yandan, genellikle sadece parametreleri geçirmeden bir şey yapamadığımda bir işlev yazarım.
thdoan

@ 10basetom: Hızlı soru: ls'deki sütunlar için farklı renkleri nasıl elde edersiniz? Dosya adlarını ls --color kullanarak filetype ile renklendirebilirim , ancak bu yararlı renkleri sütunlar için almanın bir yolunu göremiyorum. Sır nedir?
Pirx

@Pirx Sütunların varsayılan Stack Exchange sözdizimini vurgulayarak :-) renklendirildiğine inanıyorum.
16

Evet, durum böyle görünüyor, ama bu harika bir fikir ve çözümler ;-)
Pirx

6

Alfabetik sıraya göre tutmak istemenize bağlı olarak birkaç seçeneğiniz var.

Basitçe deneyebilirsin:

ls -al | sıralama -k1 -r

veya bu, aynı izinlere sahip dosyalar için alfabetik olarak sıralanmak için:

ls -al | sıralama -k1,1 -k9,9 -r

veya, onbir81’in söylediği gibi (ancak bu sürüm her şeyi listeler):

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


1
Bu daha güzel bir çözüm IMO. Sıralama yapmak için sıralama yapmak yerine birkaç işlem ve boru kullanmak, geriye doğru sıralama gibi görünmektedir. Özellikle de işten beri ls- al|sort -k1 -r. Eksik olan sadece -rbayrak.
brice

@brice 'Sıralama' konusunda beni rahatsız eden şey bu ./ve ../bu sırada ilk iki satır olmayacak. Bunun dışında daha etkili bir çözüm olduğuna katılıyorum.
15’te

Çıktı nasıl renklendirilir?
Danijel

5

To delerious010 en cevap, sana eski stil sipariş istiyorsanız o eklersiniz:

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

(veya "C" ye ayarlanmış LC_ALL veya LANGUAGE veya LC_COLLATE kullanın).

Bu benzer bir şey verecektir:

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

Yine de doğru hatırlıyorsam, gizli nokta dosyaları başlangıçta dizinlerden önce belirdi.


2

İşte bunu yapmak için bir işlev (bash veya zsh): Ve ... Bunun en iyi yol olduğunu söylemiyorum, ama şu anda kullandığım ve kullandığım yöntem:

işlev lss
{
    # En üstte bulunan dizinleri içeren dizin listesini gösterir.

    komut ls --color = her zaman $ @ | egrep '^ d | total'
    komut ls --color = her zaman $ @ | egrep -v '^ d | total';
}

Sadece bir iş bu işe yaramaz görünmüyor. Böyle bir ls -ldosya türüne göre filtrelemek için uzun liste formatını ( ) kullanmanız gerekir . Ayrıca, bu komut boşluklara (bash olarak) bölünür. Böyle bir alıntı yapmanız gerekir: "$@"Bu yaklaşımı kullanmak istiyorsanız, şöyle bir şey yapabilirsiniz:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
Altı

2

ls -laX dizinleri önce alfabetik olarak gösterir, ancak dosya listesini bozar.

Uzun seçenekler:

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

Bu, yalnızca her dizinin adında nokta bulunmadığından kesinlikle emin olmanız durumunda işe yarar.
eleven81

1

Diğer yol ...

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

VEYA

ls -la | sort -r

VEYA

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

Bunlar ne işe yarıyor? Onları yazmayı nereden öğrendin?
Tamara Wijsman

Benim tercih ettiğim işletim sistemi Debian Linux. Debian'ın gnu core lils paket sürümü ls'nin --show-dizinleri-ilk seçeneğini destekliyor ... OSX'i kullanmaya başladığımda tüm bash dot dosyalarımı Debian kutumdan aldım ve kendi dizinime bıraktım ... böylesine kırılan çok sayıda bash_alias vardı ... O zamanlar takma işlerim için bazı çözümler bulmam gerekiyordu ...
Eddie B

İlki biraz gereksiz ... Dizinler için sıralama yapmamız gerekmiyor çünkü dizinleri değil, değiştirmemiz gereken sıraya göre ... ls -la | sort -r 'gerçekten işe yarıyor. Temelde beliriyor ... 1) A) Bul. -d 1 -tipi d (Bu dizinden başla, bir dizin derinliğini araştır ve sadece dizinleri ara) B) ls -la (tüm dosyaları listele) C) Bunları tersten sırala 2) 1 olarak yap. .. Bu gerekli değil ... Aslında Studers'ın çözümünü daha çok seviyorum ... :-)
Eddie B

1

TL; DR

alias ls='ls -lhF --color'

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

alias ll=list_sorted

açıklama

Buradaki cevaplarda ve yorumlarda verilen çözümlerin bir kombinasyonunu kullanıyorum.

Varsayılan ls

Her şeyden önce, bunun için varsayılan davranışın üzerine yazarım ls:

  • -l: Listeyi daima tek boyutlu, dikey liste olarak görüntüle
  • -h: Dosya boyutlarını insan tarafından okunabilir bir şekilde görüntüler (örn. 4096 yerine 4.0K)
  • -F: Dizinler için sondaki eğik çizgi gibi göstergeleri
alias ls='ls -lhF --color'

Genişletilmiş ll

Sonra, sıralama mantığını içeren bir fonksiyon yazarım. Her biri için lsbaşlangıçta iletilen argümanları iletiyorum. Bu, takma adı kullanarak listelemek istediğimden farklı bir çalışma dizininden kullanmamı sağlıyor ls -a ~.

Ayrıca, yapılan her çağrı lsbir grepkomuta yönlendirilir. Burada sıralama gerçekleşir. ls -l | grep "^d"örneğin sadece dizinleri listeler. İlk önce dizinlerin listelenmesi gerekiyorsa, bunun da işlevde ilk sırada olması gerekir. Sıradaki şey dosya.

Son olarak, ne bir dizin ne de bir dosya (ne de dizin içeriğinin toplam boyutunu gösteren çizgi) olan her şeyi gösteririm. Bu, genel müdürlük, düzenli dosya girişleri ve toplam girişin izlenmesi ve ardından -vargüman yoluyla sonucun ters çevrilmesi ile yapılır .

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"
}

Son olarak, işlevi yeni bir komuta dönüştürüyorum. Özellikle lsfonksiyonumun bazı senaryolarda kırılması durumunda üzerine yazmak istemiyorum . O zaman kullanabilmek istiyorum ls. Alternatif olarak, takma olmayan lskomutu her zaman çağırarak çağırabilirsiniz \ls.

alias ll=list_sorted

notlar

  • Kullandığım ;yerine &&komutlar için ayırıcı olarak. Aksi takdirde, tek bir dizin içeren olmayan dizinleri içeriğini listelemek için mümkün olan (ilk ls komutu bu birleştiğinde beri bu şekilde bir sonraki komutun izin vermeyerek, yanlış olarak değerlendirilirse &&. ;Önler.)

0

Bu bir komut dosyası çözümü. Yalnızca adları listeler, inode verisi yok, alfabetik, büyük / küçük harfe duyarlı değil, sütunlara biçimlendirilmiş. Her ne kadar sütun yerine satır büyükse de, varsayılan ls çıktısı gibi. > 26 karakterden oluşan bir dosya adı varsa, sütunlar biraz dağınık olur.

rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout

IFS=$'\n' read -d '' -r -a lines < /tmp/lsout

printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

Ve başka, bazı ekstra biçimlendirme ile.

rm -f /tmp/lsout
echo "  ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

rm -f /tmp/lsout
echo "  ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

Sonuncunun çıktısı, renkleri eksi olarak aşağıdakine benzer:

  ---- Directories ----   archive/                  bookmarks/              
Desktop/                  Documents/                Downloads/              
fff/                      health/                   Library/                
Movies/                   Music/                    Pictures/               
Public/                   rrf/                      scifi/            
testdir/                  testdir2/                                         
  ------- Files -------   @todo                     comedy            
delme                     lll                       maxims                  
schedule                  vtokens style

Sadece bu betiği çağırdığından beri takma ad veya varsayılan davranışı değiştirmemeyi unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.