Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making the "ls" command sort "a" before "B" (vs a->b->A->B)

I am trying to find a way to have the results of an ls command be printed in a case insensitive manner.

currently an ls command results in:

Apple
Boy
Chart
Dock
apples
boys
charts
docks

what i want is this:

Apple
apples
Boy
boys
Chart
charts
Dock
docks

is this possible?

like image 493
Andrew Avatar asked Aug 24 '13 00:08

Andrew


Video Answer


3 Answers

ls (at least if you're using the GNU coreutils version; ls --version to check that) sorts file names according to the current locale.

The set of available locales varies from system to system (locale -a for a list), but on my system this:

LC_COLLATE=en_US.utf8 ls

sorts names with a and A before b and B -- though it might not be exactly in the order you're looking for.

This works even when ls lists files in multiple columns, something that's difficult to do with sort -f.

(I have $LC_COLLATE set to C specifically so that locale-sensitive sorting is done in ASCII order.)

like image 89
Keith Thompson Avatar answered Oct 21 '22 12:10

Keith Thompson


As a follow up to [Keith Thompson]'s answer, I tested on a Linux system and LC_COLLATE=C did not work for me, but LC_COLLATE="en_US.UTF-8" did. I put the following in my startup script:

export LANG=en_US.UTF-8
export LC_COLLATE="en_US.UTF-8"

This did not work on OS X.

like image 20
pyrachi Avatar answered Oct 21 '22 10:10

pyrachi


Just pipe the result to sort -f.

like image 23
Oliver Charlesworth Avatar answered Oct 21 '22 12:10

Oliver Charlesworth