Вопрос

Я пытаюсь отсортировать и переименовать большое количество файлов с пометкой ##### _ ##

Левая сторона подчеркивания - это числа (например, 32956715, 32956810 и т.д.), Которые не повторяются.
Правой стороной подчеркивания также являются числа (например, 1, 2, 3 и т.д.), И они повторяются.

Пример размещен на pastebin

(Левая сторона - это номер сканирования, а правая - это страница этого конкретного сканирования.)

Я хотел бы иметь возможность отсортировать левую сторону подчеркивания ZA и правую сторону AZ.

Пример:

3_1
3_2
3_3
2_1
2_2
2_3
1_1
1_2
1_3

Я открыт для любых предложений, которые достигают результата, который я ищу.

В настоящее время я использую irfanview для отправки имен файлов в текстовый файл, затем копирую и вставляю текст в Excel, разделяю имена файлов на столбцы, затем сортирую столбец с левой стороны подчеркивания по ZA и столбец с правой стороной подчеркивание AZ. Затем я полностью изменяю процесс, и программа просмотра миниатюр irfanview загружает файлы, используя текстовый файл, созданный из моего правильно отсортированного списка Excel.

Должен быть лучший способ, верно?

Благодарю вас!

ОБНОВИТЬ

Больше информации, чтобы попытаться прояснить вопрос. Мне стыдно признать это, но конечный результат - распечатать каждый из этих файлов и сделать их лицевой стороной вверх, в обратном хронологическом порядке (самый новый документ вверху (лицевой стороной вверх) и самый старый документ внизу (лицевой стороной вверх)). (Печать не очень технически подкована, не так ли?Могу ли я остаться в клубе суперпользователя - пожалуйста.)

Клиент дает нам диск с изображенными документами (TIFS или GIF-файлы с jpgs, смешанными). На дисках может быть от 50 до 20000 изображений. Я должен распечатать их. Меньшие числа = старые изображения и большие числа = новые изображения. Я использую программу просмотра миниатюр Irfanview для печати на большом копировальном аппарате. Прямо сейчас я могу только отсортировать изображения AZ до печати, сохраняя их в некотором узнаваемом порядке Затем я должен просмотреть отпечатанную стопку и выполнить обратную хронологическую сортировку самостоятельно. Это занимает очень много времени, и с приложениями к документам трудно определить, где один документ останавливается, а другой начинается.

Комментарии

Я не уверен, что понял вопрос. Если левый набор цифр никогда не повторяется, то проблема не существует. Вы не можете иметь ситуацию, как 30000_1, 30000_2, потому что левая сторона не повторяется. - Сахиль

Ты прав. Они повторяются, если в отсканированном документе более одной страницы. Я просто пытался отличить этот вид повторения от повторения с правой стороны, которое всегда начинается с 1 и подсчитывается в зависимости от количества страниц в документе.

Я хочу поблагодарить всех, кто уже задавал вопросы. Это означает, что вы хотя бы прочитали вопрос и постараетесь помочь, если бы я не пошел на все, чтобы запутать вас. Я надеюсь, что моя дополнительная информация отвечает на другие вопросы, которые я специально не задавал.

ответы

Ответ сценария Lua выглядит многообещающе, но я получаю сообщение об ошибке при попытке его использовать. Мысли?

lua -e "io.stdout:setvbuf 'no'" "Reverse_Sort.lua" 
lua: Reverse_Sort.lua:16: attempt to compare number with nil
stack traceback:
 Reverse_Sort.lua:16: in function <Reverse_Sort.lua:6>
 [C]: in function 'sort'
 Reverse_Sort.lua:32: in main chunk
 [C]: ?
Exit code: 1

1 ответ1

1

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

Вот скрипт Lua, который поможет вам.

Изменить: я обновил сценарий на основе вашей дополнительной информации. Он возьмет файл, содержащий имена файлов, отсортирует их и создаст новый файл в отсортированном порядке.

Скрипт (отредактированный)

-- Get input and output filenames from the command line or pick defaults
input_filename = arg[1] or 'unsorted.txt'
output_filename = arg[2] or 'sorted.txt'

-- Define custom sort function
function custom_sort(filename1, filename2)

    a, b = string.match(filename1, '(%d+)_(%d+)')
    c, d = string.match(filename2, '(%d+)_(%d+)')

    a = tonumber(a)
    b = tonumber(b)
    c = tonumber(c)
    d = tonumber(d)

    if a > c then
        return true
    elseif a < c then
        return false
    else
        return b < d
    end
end

-- Read filenames from file into table
local filenames = {}
for line in io.lines(input_filename) do
    filenames[# filenames + 1] = line
end

-- Sort table using our custom sort function
table.sort(filenames, custom_sort)

-- Write sorted filenames to file
io.output(output_filename)
for _,filename in ipairs(filenames) do
    io.write(filename, '\n')
end

-- Done

Lua имеет функцию os.rename(), которая фактически выполняет переименование файла, или вы, возможно, могли бы выгружать текстовый вывод скрипта в утилиту переименования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .