Команда Windows 'dir', Порядок по имени И ‹что-то›

Мы видим в каталоге файлы, упорядоченные по имени в проводнике Windows.

Если я попытаюсь сделать то же самое в командной строке Windows, она упорядочится по имени по-другому - правильно:

dir *.jpg /ON /B

cubierta.jpg
pag00.jpg
pag06.jpg
pag08.jpg
pag09.jpg
pag100.jpg
pag101.jpg
pag102.jpg
pag103.jpg
pag104.jpg
pag105.jpg
pag106.jpg
pag107.jpg
pag108.jpg
pag109.jpg
pag11.jpg, etc, etc, etc, ...

Есть ли способ заставить dir упорядочивать по имени, где он читает числа, как это сделал бы человек?


person ian_scho    schedule 28.10.2008    source источник
comment
Джефф Этвуд обсуждал это в своем блоге здесь: codinghorror.com/blog/archives/001018. html   -  person Jon Limjap    schedule 28.10.2008
comment
@JonLimjap Ссылка перенаправляет на главную страницу блога Джеффа?!   -  person steenhulthin    schedule 06.05.2014
comment
@steenhulthin ШОКЕР!! Этвуд решает изменить свое мнение о чем-то и в процессе всех трахает.   -  person Keng    schedule 06.05.2014
comment
@steenhulthin Извините, это комментарий 5-летней давности, поэтому ссылка, вероятно, устарела. Обновленная ссылка находится здесь: blog.codinghorror.com/sorting-for -humans-natural-sort-order   -  person Jon Limjap    schedule 06.05.2014


Ответы (6)


Ваш лучший вариант (если это возможно) — добавить достаточно начальных нулей (в данном случае два) к вашим меньшим числам, чтобы сортировка вышла ожидаемой.

person Doug L.    schedule 28.10.2008
comment
Если я когда-либо предполагаю необходимость обрабатывать файлы по порядку, я добавляю от 1 до 4 начальных нулей или использую полную метку времени в формате UTC, 20081028143531. Это старый трюк, датирование еще в конце 70-х или начале 80-х. Может, раньше... - person Ken Gentle; 28.10.2008

Проводник Windows использует специальную функцию сортировки, StrCmpLogicalW, который не используется cmd.exe, отсюда и различия в выводе. Однако вы можете написать свою собственную программу сортировки.

Вас также могут заинтересовать записи Майкла Каплана на этом тема (из окно предложений).

person Rômulo Ceccon    schedule 28.10.2008

Это называется естественной сортировкой. В настоящее время нет встроенных инструментов командной строки, которые могут сортировать естественным образом. Если вы хотите, проголосуйте за эту функцию, чтобы Microsoft передумала.

Однако это можно смоделировать с помощью замены регулярного выражения нулями, чтобы числа имели одинаковую длину. Таким образом, лексикографическая сортировка эквивалентна естественной сортировке. В Windows для этого можно использовать Jscript и VBS. Но проще всего использовать powershell. Вы можете вызвать его из cmd.exe следующим образом

powershell -Command "(Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name"

Конечно, вам нужно будет изменить число в PadLeft(20), если ваши файлы содержат более длинные серии цифр.

Как сортировать по имени файла так же, как это делает проводник Windows?

Собственное пакетное решение можно найти в разделе Пакетная сортировка файлов, если ваши файлы имеют только один номер в конце.

@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
    set num=00000000000000000000%%a
    set num=!num:~-20!
    set $!num!=%%a
)
for /f "tokens=1,* delims==" %%a in ('set $0') do echo %%b
person phuclv    schedule 16.08.2018

Он он он. Вы все хотите знать мое решение?

Я использую программу ImageMagick для преобразования моих 200-мегабайтных PDF-файлов в JPG. В конце длительного процесса он сериализует все файлы в числовом порядке ... Таким образом, в основном дата создания файла немного увеличивается в значении, когда каждый файл записывается на жесткий диск. Таким образом, любая из следующих двух команд пакетного файла запишет файлы в «правильном» порядке:

dir *.jpg /ODN /B > files.txt

for /f "tokens=*" %%a in ('dir *.jpg /ODN /B') do (
    echo ^<page^>%%a^</page^> >>pages.xml.fragment
)

Таким образом, команда dir *.jpg /OD упорядочивает содержимое каталога по возрастанию (создания?) даты, и мы можем полностью игнорировать фактическое имя файла.

person Community    schedule 09.12.2008
comment
Я почти уверен, что дата последней модификации (а не дата создания) используется для «dir / od». Для даты создания вам нужно «dir / tc / od». - person system PAUSE; 03.04.2009

4NT/TCC/TC от JPSoft по умолчанию использует естественный порядок сортировки. В качестве альтернативы, если у вас есть доступ к программе GNU sort, такой как инструменты Cygwin, вы можете сделать что-то вроде ls -1 | /<cygwin>bin/sort -g или dir /b | \cygwin\bin\sort -g ; это даст вам имена файлов в естественном порядке сортировки.

Если вы ограничены инструментами, встроенными в Windows, вы можете попробовать сценарий Windows инструменты и выполните что-то вроде использования FileSystemObject для получения имен файлов и регулярные выражения для извлечения числовой части имен файлов для использования в качестве ключей в объекте Dictionary. Я оставлю фактическое кодирование в качестве упражнения для читателя :)

person Community    schedule 28.10.2008

Нет, нет способа сделать это. Проводник Windows использует другой подход для решения этой проблемы.

person Biri    schedule 28.10.2008