Команда «dir» Windows, Порядок по имени И <something> - PullRequest
4 голосов
/ 28 октября 2008

Мы можем видеть в каталоге файлы, упорядоченные по имени в проводнике 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 упорядочить по Имени, где он читает числа, как это сделал бы человек?

Ответы [ 6 ]

7 голосов
/ 28 октября 2008

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

4 голосов
/ 28 октября 2008

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

Возможно, вас также заинтересуют записи Майкла Каплана о этой теме (из предложения Рэймонда Чена ).

1 голос
/ 09 декабря 2008

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

Я использую программу ImageMagic, которая конвертирует мои PDF-файлы размером 200 МБ в формат 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 упорядочивает содержимое каталога по возрастанию (созданию?), И мы можем полностью игнорировать фактическое имя файла.

0 голосов
/ 16 августа 2018

В настоящее время нет встроенных инструментов командной строки, которые могут сортировать естественным образом. Если вы хотите, проголосуйте за функцию , чтобы заставить 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
0 голосов
/ 28 октября 2008

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

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

0 голосов
/ 28 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...