У меня есть куча файлов от log1
до log164
.
Я пытаюсь перечислить каталог (отсортированный) в терминале UNIX, но функции сортировки предоставляют только такой формат:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Что я хочу это
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Любые предложения в том, что я мог бы использовать для этого?
log1.gz
черезlog164.gz
, то , что вы даже не нужноls -1
им для?ls -1
делает: в нем перечислены имена файлов. Поскольку вы уже знали имена файлов, я не понял, для чего вам это нужно. Но поскольку вы приняли ответ Кевина, теперь я знаю: он вам не нужен. Что имеет больше смысла. :-)Ответы:
bash
Брекеты,{}
перечислю их по порядку:источник
Почему бы не использовать встроенную
ls
функцию для этого конкретного случая, а именно-v natural sort of (version) numbers within text
Например
ls -1v log*
источник
sort
, если у вас есть массив строк, а не каталог файлов-v - Force unedited printing of non-graphic characters
.ls | sort -n
С GNU ls (т.е. в Linux, Cygwin или других системах, в которых специально установлены GNU ls):
В зш:
В других оболочках:
Замените
echo
на,printf '%s\n'
если вы хотите, чтобы каждое имя файла находилось в отдельной строке.Если вам также нужны метаданные файла (
ls -l
) и у вас нет GNU ls, вам нужно будет вызыватьls
отдельно для каждого имени файла или группы имен файлов, которые вы хотите видеть в лексикографическом порядке.Чтобы избежать этих трудностей, используйте достаточно начальных нулей в именах файлов, чтобы лексикографическая сортировка была удобной для человека (
log001.gz
и т. Д.).источник
Хотя решение
ls -1v
, безусловно, самое приятное в данном конкретном случае, я думаю, что было бы хорошо иметь такое, с которым можно работать,sort
как в первоначальном вопросе, поскольку оно работает и тогда, когда ваш вклад не приходитls
. В этом случае вы можете использовать:-n
Опция указывает сортировки для сортировки численно, и-k 1.4
устанавливает ключ сортировки в первом поле (которое все имя файла в данном случае) , начиная с 4 - го символа до последнего.источник
ls -1 | sort -n -k1.4
не работает. Он дает несортированным сначала до 4 символов, затем сортирует после 4-го символа. Я использовалls -1 |sort | sort -n -k1.4
вместо этого, и он работал отлично.sort -k1.1,1.3 -k1.4n
.sort
реализации не обязательно должны быть стабильными, поэтому ваш подход не будет работать со всеми реализациями. Смотрите также-V
опцию GNU и FreeBSDsort
.GNU
sort
(как доступно в Linux) имеет режим «сортировки версий», который интерпретирует числа внутри не-чисел так, как вы просите:От
man 1 sort
:(Создание пустых тестовых файлов в список:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
)Ваш пример случая, добавив
-V
опцию (или--version-sort
):источник
если вы используете Mac или BSD, попробуйте это:
источник
Моя версия Solaris не поддерживает
ls -v
(grrr). И решение для сортировки, представленное выше 1), требует знания позиции цифр в имени файла, и 2) не обрабатывает такие вещи, как номера версий из нескольких частей.Подход, описанный ниже, совместим с Solaris, не требует предварительного знания позиций цифр и обрабатывает номера версий с 2, 3 или 4 компонентами (например: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Он также используется
sort -f
для складывания прописных и строчных букв и правильно обрабатывает каталоги, смешанные с файлами:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Обратите внимание, что эта версия ограничивает первый компонент одной цифрой.
Если ваша целевая операционная система (ы) поддерживает
ls -v
, это, безусловно, лучшее решение.источник
Perl решение:
источник
источник
-t .
лишнее.Это сработало для меня.
У меня есть файлы 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
путается сls
выводом из-за непечатаемых цветных символов. Если вы попробуете это:ls -1 --color=none *.jpg | sort -n
это будет работать отлично.
sort
может игнорировать непечатные символы с-i
опцией, но она все еще не работает, и я не знаю почему.Но вы всегда можете обрезать цвет следующим образом
sort
:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Я надеюсь, что однажды
sort
будет возможность для этого.источник