Önce ls alt çizgi karakterlerini nasıl sıralayabilirim?


20

Aynı düzeydeki diğer dosya ve dizinlerden ayrı tutmak istediğim bir şey varsa, alt çizgi önekiyle dosya ve dizinleri adlandırabilmeyi seviyorum. Örneğin Windows ve Mac'te, alt çizgi içeren bir dosyanın önekini alfanümerik bir karakterle başlayan dosyaların önünde en üste sıralar.

Google'ım, LC_COLLATE ve geçerli yerel ayarım (en_US) ile ilgili olduğu ortaya çıktı. En_US'un neden beklendiği gibi sıralanmadığını gerçekten anlamıyorum.

En_US_POSIX için ICU Collate gösteri sitesi ayar yerel ayarına dayalı olarak kesinlikle aradığım sıralama düzenine sahip gibi görünüyor (örnek verileri düzenlemeniz ve test etmek için bazı alt çizgiler eklemeniz gerekir). Ama bunu Linux kabuğuma nasıl uygulayacağımı gerçekten göremiyorum.

İdeal olarak, bash yapılandırmamda bir şey ayarlayabilmek istiyorum, böylece her zaman önce alt çizgileri sıralar. Bunu nasıl yapabilirim?


"Yerel ayar için kurallar getir" yoluyla varsayılan veya en_US_POSIX.txt ile ICU Collate kullanarak çoğaltma yapamıyorum. Kullandığınız ayarları açıklayabilir misiniz?
Mikel


@Mikel, yukarıda verdiğim bağlantıyı kullanarak test verilerine bazı alt çizgiler ekleyin ve ardından sıralama sonuçlarını görmek için gönderin.
Tom Auger

Bu tam olarak yaptığım şeydi ve alt çizgilerle başlayan dizeler, alt çizgiler yokmuş gibi başından ziyade ortada sıralanıyor.
Mikel

1
Harmanlama sırası tanımını gerçekten değiştirmeyle ilgili bir soru unix.stackexchange.com/questions/421908'dir .
JdeBP

Yanıtlar:


5

İstediğiniz lsşekilde sıralayamazsanız, kabuk genişletmeyi deneyin.

lsKullandığınız yöntemi atlayarak kabuğun zaten sıraladığı dosyaların bir listesiyle çalışmak için dosya adı desenlerini kullanabilirsiniz ls.

ls -lf _* [!_]*

Dosyalara sahip olduğunuzu varsayarsak

_a a _b b _c c

bu koşmak gibi

ls -lf _a _b _c a b c

Açıklama:

_* alfabetik sırayla genişletilmiş, alt çizgiyle başlayan herhangi bir dosya adıyla eşleşen bir kabuk desenidir.

[!_]*herhangi bir dosya adı ile eşleşen değil alfabetik sırayla genişletilmiş bir alt çizgi ile başlayan.

-fsöyler lsiçin değil kabuk zaten yaptım çünkü, sıralama.

Daha fazla bilgi: bash dosya adı genişletmesi

Geçerli dizinde dizinler varsa, dizinlerdeki dosyaları listelemekten kaçınmak için komutu aşağıdaki gibi çalıştırmak istersiniz:

ls -lfd _* [!_]*

7
Bu arada, DOS / Windows / OSX gerçekten başka bir şeyden önce alt çizgi koymazlar: harflerden önce gelen alt çizgi ile büyük / küçük harfe duyarsız olarak sıralarlar, ancak diğer bazı noktalama işaretleri alt çizgiden önce veya sonra gider. Kullanılması _dosyalar ilk görünmesi için bir OS özgü kesmek olduğu; ve bu saldırının unix sürümü dosya adını büyük harfle başlatmaktır: varsayılan unix kuralı dosya adlarında yalnızca küçük harfler kullanmaktır.
Gilles 'SO- kötü olmayı bırak

4
Veya sıfırlar; örn 00README.
mattdm

1
@Gilles +1, en önemli uygulamalarda ilk önce onları kullanmak için unix en iyi uygulama için. Günün sonunda, eğer konvansiyon buysa, unix'i diğer OS'lerin yaptığı gibi davranmaya zorlamak yerine Mac veya Windows için geliştirilen konvansiyonları kullanabilmemden ziyade basitçe benimsemem en iyisidir. Büyük ipucu için teşekkürler.
Tom Auger

1
@TomAuger kendi sıralamasını yapmamasını -fsöyler ls, bu nedenle argümanlarını geçildikleri sırayla görüntüler. Her kabuk joker genişletme sonucu _*ve [!_]*sözlükbilimsel olarak sıralanmış bir listedir.
Gilles 'SO

1
@TomAuger Kabuk tarafından oluşturulduklarında, bağımsız değişkenler lssıralanır (iki grupta: önce başlayanlar _, sonra diğerleri). echo ls -lf _* [!_]*Ne olduğunu görmek için koş . -fBayrak söyler lsherhangi sıralamayı yapmamaya.
Gilles 'SO- kötü olmayı bırak'

16

Küçük ve büyük harfleri karıştırmak istemiyorsanız C, karakterleri sayısal sırayla alan yerel ayarınızı olarak ayarlayın . _büyük ve küçük harf arasındadır.

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

Yerel ayarlar LC_MESSAGES(hata mesajlarının dili), LC_CTYPE(karakter kümeleri) ve LC_TIME(tarih ve saat biçimi) yararlıdır. LC_COLLATEve LC_NUMERICgenellikle değerlerinden daha fazla sorun çıkarırlar, onları ayarlamanızı önermem. Uygun sözlükbilimsel sıralama, belirtilmesi gerekenden daha karmaşıktır LC_COLLATEve normal ifadelerde karakter aralıklarını kullandığınızda her türlü garip davranışa neden olabilir. LC_NUMERICbir şey korkunç bir şekilde yanlış gittiği durumlar dışında çoğunlukla kozmetiktir, çünkü bazı programlar ondalık ayırıcıdan başka bir sayı üretmiştir ..


+1 Çok ilginç. Yani bu formu kullanarak, geçici olarak ortam değişkenini LC_COLLATE yalnızca ls örneği için ayarlıyorsunuz? Bu doğru mu?
Tom Auger

1
Alt çizgileri büyük harflerden ÖNCE göstermenin herhangi bir yolu var mı?
Tom Auger

1
@TomAuger Evet, VAR=value cmdsetleri VARiçin valuesadece ortamında cmdve bunu çalıştırmak kabuğunda değerini (ya da değerli yokluğunu) dokunmuyor. Alt çizginin büyük harften önce görünmesini sağlamak için kendi yerel ayarlarınızı tanımlamanız gerekir. Bu mümkündür, ancak kullanımı gariptir, çünkü en azından Linux altında, standart kütüphane sadece yerel tanımları arar /usr/lib/locale- ayarınızı ~/.localekoyabileceğiniz ortam değişkeni veya yok en_tom.
Gilles 'SO- kötü olmayı bırak

@TomAuger Bu sadece komutla ilgiliyse ls, Mikel'in önerisiyle devam edin .
Gilles 'SO- kötü olmayı bırak

2

Ne yazık ki Linux, ICU için değil, yerel bilgi için glibc kullanır, bu nedenle ICU'yu glibc'ye uyarlamak veya glibc'deki yerel bilgileri tamamlamak için çok fazla çaba harcamadan doğrudan Linux'a uygulamanın bir yolu yoktur.


-4

-fAnahtarı eklemek (sıralama yok) benim için bu şekilde gösterilmesini sağladı.

man ls

[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _3
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 3

6
Sadece dosya sisteminde bu şekilde saklandıkları için.
Ignacio Vazquez-Abrams

3
Üzgünüm, ama bu cevap çok yanlış. Test: touch 3 1 _1 _3 2 _2 && ls -flçıkışlar2 . 1 3 _2 _3 .. _1
Marco
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.