2

Я хочу переименовывать файлы, содержащие числа, дополняя их нулями. Цель состоит в том, чтобы отсортировать пронумерованные наборы файлов в алфавитном порядке в правильном порядке в любом приложении.

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

Т.е. список файлов с такими именами:

xx 1 abc.txt
xx 2 def.txt
xx 3 ghi.txt
xx 3.5 jkl.txt
xx 4a mno.txt
xx 4b pqr.txt
...
xx 100 end.txt

должен стать:

xx 001 abc.txt
xx 002 def.txt
xx 003 ghi.txt
xx 003.5 jkl.txt
xx 004a mno.txt
xx 004b pqr.txt
...
xx 100 end.txt

(Система Windows XP)

(Проводник Windows использует некоторую эвристику для сортировки файлов с номерами таким образом, не всегда правильно. Я, однако, ищу способ на самом деле переименовать файлы)

добавление

Меня назвали этим вопросом в качестве возможного дубликата:как я могу переименовать файлы? Упомянутые там инструменты (Bulk Rename Utility, AntRenamer, Free Commander Portable и т.д.), Насколько я могу судить, не способны определить минимальное количество отступов, необходимое для каждого набора файлов.

Я думал так: Explorer способен обнаруживать файлы с последовательными номерами, даже если они выровнены по левому краю без отступов, как в моем первом примере выше. Он использует это обнаружение для правильной сортировки файлов.
(см., например, http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html )
Я ищу инструмент, который делает то же самое обнаружение, но также переименовывает файлы соответственно.
(Нахождение наибольшего числа для каждого связанного набора файлов, а не просто наибольшее число во всем каталоге, и затем добавление чисел в каждом наборе.)

Или, говоря иначе: я хочу сделать "естественную сортировку" для всех файлов в каталоге, а затем переименовать их так, чтобы сортировка ascii была идентична "естественной сортировке"

Теперь я подозреваю, что не существует инструмента, способного сделать это, поэтому мне, вероятно, просто нужно написать скрипт.

1 ответ1

0

Это должно работать на своем базовом уровне. Сначала сделайте резервную копию!

cd to dir, содержащий файлы: 99999 - description.txt

perl rename-pad.pl

#!/usr/bin/perl
opendir(DIR, ".");
@files = sort(grep(/txt$/i, readdir(DIR)));
closedir(DIR);

$len=0;
foreach $file (@files) {
    print $file."\n";
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $len=(length($1)>$len)?length($1):$len;
    }
}
foreach $file (@files) {
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $newfile=sprintf("%0${len}d%s", $1, $2);
        rename("$file", "$newfile");
    }
}

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