Мне нравится иметь возможность присваивать имена файлам и каталогам префикс подчеркивания, если я хочу отделить их от других файлов и каталогов на том же уровне. Например, в Windows и Mac префикс файла с подчеркиванием сортирует его по началу, перед файлами, начинающимися с буквенно-цифрового символа.
Я обнаружил, что поиск в Google связан с LC_COLLATE и моей текущей локалью (en_US). Это хорошо, хотя я действительно не понимаю, почему en_US не сортирует, как ожидалось.
Основываясь на настройке локали демонстрационного сайта ICU Collate в en_US_POSIX, безусловно, имеет искомый порядок сортировки (вы должны отредактировать пример данных и добавить несколько подчеркиваний, чтобы проверить их). Но я не понимаю, как применить это в моей оболочке Linux.
В идеале я хотел бы иметь возможность настроить что-то в моей конфигурации bash, чтобы ls всегда сначала сортировал подчеркивания. Как бы я поступил так?
Ответы:
Если вы не можете
ls
отсортировать, как хотите, попробуйте расширение оболочки.Вы можете использовать шаблоны имен файлов для запуска
ls
со списком файлов, которые оболочка уже отсортировала, минуя используемый методls
.Если у вас есть файлы
это как бег
Объяснение:
_*
шаблон оболочки, соответствующий любому имени файла, начинающемуся с подчеркивания, расширенный в алфавитном порядке.[!_]*
соответствует любому имени файла, не начинающемуся с подчеркивания, расширенному в алфавитном порядке.-f
говорит ,ls
чтобы не сортировать, так как оболочка уже сделал.Больше информации: расширение имени файла bash
Если в текущем каталоге есть каталоги, вы можете выполнить команду, подобную этой, чтобы избежать ls перечисления файлов в каталогах:
источник
_
для того, чтобы файлы появлялись первыми, является хаком для конкретной ОС; и Unix-версия этого хака заключается в том, чтобы начинать имя файла с заглавной буквы: соглашение Unix по умолчанию заключается в использовании только строчных букв в именах файлов.00README
.-f
говоритls
не делать свою собственную сортировку, поэтому она показывает свои аргументы в порядке , они прошли. Результат каждого оболочки подстановочного расширения_*
и[!_]*
является лексикографически отсортированного списка.ls
сортируются (в две группы: те, которые начинаются с_
, затем другие), когда они генерируются оболочкой. Беги,echo ls -lf _* [!_]*
чтобы увидеть, что происходит.-f
Флаг говоритls
не делать какую - либо сортировки.Если вам не нужно смешивать строчные и прописные буквы, установите для вашей локали значение
C
, которое принимает символы в их числовом порядке._
падает между прописными и строчными буквами.Настройки локали
LC_MESSAGES
(язык сообщений об ошибках),LC_CTYPE
(наборы символов) иLC_TIME
(формат даты и времени) очень полезны.LC_COLLATE
и,LC_NUMERIC
как правило, больше проблем, чем они стоят, я не рекомендую устанавливать их. Правильная лексикографическая сортировка сложнее, чемLC_COLLATE
предполагается, и может вызывать все виды странного поведения при использовании диапазонов символов в регулярных выражениях.LC_NUMERIC
в основном косметический, за исключением случаев, когда что-то идет ужасно неправильно, потому что какая-то программа выдает число с десятичным разделителем, кроме.
.источник
VAR=value cmd
наборыVAR
дляvalue
только в средеcmd
и не затрагивает значение (или отсутствие значения) в оболочке , где вы запустите его. Чтобы подчеркивание отображалось перед заглавными буквами, вам необходимо определить свои собственные настройки локали. Это возможно, но неудобно в использовании, потому что, по крайней мере, в Linux стандартная библиотека ищет только определения локали/usr/lib/locale
- в ней нет~/.locale
переменной среды, в которую вы можете поместить свойen_tom
параметр.ls
команде, следуйте совету Микеля .К сожалению, Linux использует glibc для информации о локали, а не ICU, поэтому нет никакого способа напрямую применить это к Linux, не затрачивая много усилий, ни перенеся ICU в glibc, ни добавив информацию о локали в glibc.
источник
Добавление
-f
переключателя (без сортировки) заставило меня показать это таким образом.man ls
источник
touch 3 1 _1 _3 2 _2 && ls -fl
выходы2 . 1 3 _2 _3 .. _1