unixcommand-lineterminal

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?


Solution

  • 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.)