Mac OSX'te büyük / küçük harf duyarlı ls sıralama


30

Nasıl yapabilir lsMax OS X Lion sıralama dosya ve Ubuntu Linux (dizinleri DEĞİL üstüne, nokta dosyalar DEĞİL üstte küçük harf duyarsız) yaptığı gibi, dizinleri komut? İdeal olarak, bunu sort gibi başka bir komuta çıkış vermeden yapmak istiyorum.

Örneğin, görmek istiyorum:

foo
Foobar
MyStuff/
.stuff/
test.txt

onun yerine:

.stuff
Foobar
MyStuff/
foo
test.txt

Linux'ta, lssıralama düzeni, özellikle sistemin yerel ayarları tarafından kontrol edilir LC_COLLATE. Ne zaman LC_COLLATE=en_US.UTF-8istediğim gibi öğeleri sıralayacak. Ne zaman LC_COLLATE=C, lsOS X'e benzer bir sıralama yapacak.

LC_COLLATEen_US.UTF-8OS X'te ayarlanmış , ancak lsyine de eski POSIXyolu sıralar . Bunun Linux gibi nasıl davranabileceğimi bilen var mı?


Yardımcı olursa: apple.stackexchange.com/a/22304/8546 HFS Plus'ın genellikle büyük / küçük harf duyarlı değil, küçük harf koruyacak şekilde yapılandırıldığını gözlemler .
Graham Perrin

Yanıtlar:


16

Bu mümkün olmayabilir:

Bir göz alarak ls için kaynak koduna , bu LC_COLLATE uymalıdır böylece dosya adlarını sıralamak için strcoll kullanır ve.

Bazı ilanlar çevrimiçi BSD'deki (ve Darwin / OS X) yerellerin Linux'takilere göre biraz kırıldığını gösteriyor. Açıkça yerel ayarını belirleyen ve makinemdeki en_US.UTF-8 ve C yerel ayarlarını (Mac OS 10.6.3) ve bir üniversite makinesini (Linux, FC11?) Kullanarak test eden kendime ait hızlı bir sıralama programı yazdım. Sıralama linux makinesinde beklendiği gibi çalışsa da ("a B c" vs "B a c"), mac onları her zaman "B a c" olarak sıralar.

Kaynak: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

ORİJİNAL CEVAP

Bu komut nokta dosyalarını sıralamaz ancak ek dizin listeleri gösterir.

ls -f1 

Buna yaklaştım:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
-F seçeneğiyle "devre dışı bırakma sıralamasının" ilginç olması aslında beklendiği gibi sıralanması gibi görünüyor. Bunun daha doğal bir harmanlama ile dosya sistemi / HFS + sıralama girişleri olduğunu farz ediyorum.
Gerry

6

Bunun cevaplandığını biliyorum ama bu benim için en iyisi:

ls -f1 -alF -G

Tüm ayrıntıları listeler ve durumu görmezden alarak sıralar.


4

Bu beni bir süredir rahatsız ediyor, ve sonunda sıraladım. İşe yaramayan bir sürü öneriyi denedikten sonra, işte ne oldu.

MacPorts'u (veya Homebrew veya Fink) kurmaya istekliysen, GNU'nun GNU sürümü tam olarak istediğini yapar. MacPorts'u kendim kullanıyorum, bu yüzden açıklayacağım yaklaşım bu:

  1. MacPorts'u indirin ve yükleyin:

    http://www.macports.org

  2. GNU Coreutils paketini kurun:

    sudo port install coreutils

  3. Artık GNU ls sahip olmalıdır: gls. Hem büyük hem de küçük harf ile başlayan öğeleri içeren bir dizinde deneyin:

    gls -U

    ( -USeçenek aslında "sıralanmamış" anlamına gelir, ancak OS X'te büyük / küçük harfe duyarsız hale getirilmesi istenen etkiye sahiptir.)

  4. Bu takma adı .bash_profile, normalde lsistediğiniz şekilde çalışacak şekilde ekleyin (renkli çıktıyı beğendim, ancak isterseniz, ihmal edebilirsiniz; yalnızca ihtiyacınız var -U):

    alias ls='gls -U --color'

-USeçeneğin muhtemelen diğer platformlarda çalışmadığını unutmayın . OS X'te, her zaman doğru olanı yapıyor gibi görünüyor (belki de HFS + teknik olarak büyük / küçük harfe duyarlı değil - "büyük / küçük harfe duyarlı", teknik olarak), ancak Linux kutusunda denerseniz, sonuçların büyük olasılıkla olmayacağı hiç sıralanmış.


1
3. Artık yeni APFS nedeniyle macOS> = 10.13 altında istenen yan etkiye sahip görünmüyor (-U seçeneği).
Marius Hofert

1
Evet… APFS ile bunu yapmanın bir yolu yok gibi görünüyor.
Jason Sims,

Onayla yine de 10.12'de çalışır. Teşekkürler!
Albay Panik

4

Mike'ın yukarıda yazdıklarını ekleyerek biraz daha ileri götürdüm ve kendi harmanlama kurallarınızı tanımlamanın bir yolunu buldum.

Yerel tanımları / usr / share / locale / içinde bulunur. Her klasör bir yerel ayardır ve bir dosyanın (veya bir bağlantının) LC_COLLATE dosyası vardır; bu, hangi sembollerin "aynı" olduğunu tanımlar (örneğin, sipariş verirken U, u ve ü aynı sayılmalıdır). Bir dizini çoğaltabilirsiniz ve bu, yeni bir yerel ayar tanımı oluşturacaktır:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Şimdi 'en_GB.UTF-8-CI' (büyük küçük harf duyarlılığı için 'CI') adında yeni bir yerel ayarınız olacak ve buradan LC_COLLATE kullanabilirsiniz.

Şimdi, gelen yerel kaynaklardan indirebilirsiniz yeni yerel LC_COLLATE değiştirmeye http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ birini düzenlemek, istediğin ve kaçtığın şeye en yakın

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

ve şimdi kaçtığında

$ LC_COLLATE=en_GB.UTF-8-CI ls

Eğer sıralama göre olacak senin kurallarına.

Evet, 's' harfini büyük / küçük harfe duyarsız hale getirmek için gereken budur.


2

Çözüm olarak, bir işlev ve bir takma ad kullanabilirsiniz:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Bu, standart ls komutu için duyarsız olarak sıralanmış bir çıktı üretir.


1
Not etmeliyim: örneğin -l kullanılırsa bu başarısız olur. Sonra başlangıçta, sıralanacak olan başka bir "toplam X" satırı üretir.
Arne

2

kullanma

ls -f

benim için çalışıyor.

-f resmen herhangi bir sıralamayı kapatır, ancak orijinal HFS sıralaması tam olarak küçük harfe duyarsız bir sıralama olana benzer şekilde görünür.

Sanırım, HD formatınızın büyük / küçük harf duyarlı olmasına veya olmamasına bağlı olarak değişir, ancak büyük / küçük harf duyarlı HFS formatı Mac OS X sistem diskleri için varsayılan olduğundan, bunun çoğu kullanıcı için çalışması gerekir.


Bu kesinlikle doğru cevap. Bununla ilgili tek sorun, dolaylı olarak -a da açık olması ve bunu kapamanın bir yolu yok ki bu da dahil olmak üzere bir süre ile başlayan dosya / klasörleri gösterecek. ve .. .
lensovet

Diğer problem (şimdi), yeni APFS nedeniyle bunun artık macOS> = 10.13 altında işe yaramayacağıdır.
Marius Hofert

0

Çalıştırmak:

$ type ls

Muhtemelen lskomutunuzun diğer isimlendirilmiş olduğunu göreceksiniz .


Linux üzerinde: ls is /bin/ls. OS X'te: ls is hashed (/bin/ls). Her iki durumda da, /bin/lsdoğrudan çağırsam bile, yine de LC_COLLATE'e göre sıralama yapmıyor.

2
Bu şaşırtıcı, lsemrinizin de ekleneceği diğer adıma bahse girerdim --group-directories-first. Hala başka bir yerde yapılabilir, takma ad değil.
MikeyB

0

Eğer esas olarak nokta dosyalarının sıralama düzeniyle ilgileniyorsanız, uzantıya göre sıralayabilirsiniz : GNU Fileutilsls komutunu seçeneğiyle birlikte kullanın . (GNU Fileutils'i, örneğin macport'lar aracılığıyla yükleyebilirsiniz.)--sort=extension


0

ls LC_COLLATE'e göre sıralama yapıyor, sadece LC_COLLATE dosyalarının çoğu büyük / küçük harf duyarlı sıralama yapacak şekilde ayarlanmış. http://collation-charts.org/fbsd54/

Büyük / küçük harfe duyarsız sıralama için ayarlanmış iki tane vardır: cs_CZ.ISO8859-2 ve et_EE.ISO8859-15 et_EE.ISO8859.15, İngilizce konuşanların istediği şekilde "Z" yazmaz. cs.CZ.ISO8859-15 alfabesiyle iyi bir iş çıkarsa, alfabetik karakterlerden önce "~" sıralamasını diliyorum.

Benim çözümüm: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Özel bir LC_COLLATE dosyası "." İşlemek için yapılabilir olup olmadığını merak ediyorum. istediğin gibi ve istediğim gibi "~".


0

Mike'ın cevabından ilham alarak, / etc / bashrc dosyasına aşağıdakileri ekledim ve Mojave'de güzel çalışıyor. -A eklendiğinde sonunda gizli dosyaları listeler, ancak bu beni rahatsız etmiyor.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

Locale komutunu çalıştırarak yeni yapılandırmayı görebilirsiniz. Geri dönmek için, sadece / etc / bashrc satırını kaldırın ve tekrar terminale giriş yapın.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Ne ls -f1 ne de ls -f'nin Mojave'de benim için çalıştığını unutmayın. Gerçekten sıralanmamış bir liste ile sona erdi. Sadece sağladığım çözüm Mojave'de benim için çalıştı.

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.