Это можно сделать с помощью следующего вкладыша Windows PowerShell (для удобства чтения он разделен на четыре строки):
Get-ChildItem -Filter "*.txt" |
Sort-Object { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) } |
gc |
sc result.txt
Get-ChildItem
извлекает имена файлов, но они будут в неправильном порядке (сортировать ASCIIbetically, а не по алфавиту).
Командлет Sort-Object
используется для сортировки имен файлов, как вы указали, путем добавления чисел в имени файла перед сравнением имен.
gc
- это псевдоним для Get-Content
, который считывает содержимое всех входных файлов.
sc
- это псевдоним для Set-Content
, который записывает результат в указанный файл.
Вот альтернативный подход с использованием C #, в случае, если вы не можете / не будете использовать PowerShell:
static class Program
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
static extern int StrCmpLogicalW(string s1, string s2);
static void Main()
{
string[] files = Directory.GetFiles(@"C:\Path\To\Files", "*.txt");
Array.Sort(files, StrCmpLogicalW);
File.WriteAllLines("result.txt", files.SelectMany(file => File.ReadLines(file)));
}
}
При этом используется функция StrCmpLogicalW
для получения имен файлов в правильном порядке (эта функция на самом деле используется Windows Explorer для сортировки имен файлов).