Переименовывает файлы с последовательными числами [дубликат]

Этот сценарий:

#!/bin/sh
echo $@

производит:

$ ./test.sh 1 23 4 5 6
$ 1 23 4 5 6
1
03.02.2019, 13:17
1 ответ

Если у вас установлен инструмент renameна основе perl-, который иногда называют prename, вы можете сделать это в одну строку, например

rename -n 's/^(.{8})(.{6})\.(.*)/sprintf "%s%06d.%s", $1, ++$a, $3/e' *.nc

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

Если вам интересно, это заменяет три раздела (..)(, где .{n}представляет nсимволов, .*представляет что угодно , а скобки создают группу )с результатом форматированной печати, содержащей первую группу и возрастающее шестизначное число. (Вторая группа не используется. )Третья группа переносится через имя расширения файла.

Должен заметить, что он отказывается перезаписывать существующие файлы.

Пример вывода

20091208170014.nc renamed as 20091208000001.nc
20091208171946.nc renamed as 20091208000002.nc
20091211150704.nc renamed as 20091211000003.nc
20091211152610.nc renamed as 20091211000004.nc
20091214131328.nc renamed as 20091214000005.nc
20091217111953.nc renamed as 20091217000006.nc
20091220092643.nc renamed as 20091220000007.nc
20091223073308.nc renamed as 20091223000008.nc
20091226053932.nc renamed as 20091226000009.nc
20091229034557.nc renamed as 20091229000010.nc

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

  1. Если у вас достаточно мало файлов, чтобы оболочка могла полностью развернуть список, стоит отсортировать файлы:

    rename -n '..as above..' $(ls -d *.nc | sort -k1.9,1.14n)
    
  2. Выполните преобразование, чтобы ключ сортировки временно помещался в начало имени файла, а затем переименовывался, а затем заменялся там, где он должен быть:

    # Swap the first eight and second six groups around
    rename -n 's/^(.{8})(.{6})\.(.*)/$2$1.$3/' *.nc
    
    # Apply the transform with the shell sorting by original sequence
    rename -n 's/^(.{6})(.{8})\.(.*)/sprintf "%06d%s.%s", ++$a, $2, $3/e' *.nc
    
    # Swap back the first six and second eight groups
    rename -n 's/^(.{6})(.{8})\.(.*)/$2$1.$3/' *.nc
    

Как и прежде, удалите -nдля бесшумной работы или замените его на -v, чтобы увидеть, что на самом деле произошло.

1
27.01.2020, 23:31

Теги

Похожие вопросы