Рейтинг:2

Как пакетно переименовать номера с последовательным префиксом в новые последовательные префиксы через терминал?

флаг ng

Как я могу пакетно переименовать с помощью терминала набор файлов, в которых несколько номеров имеют один и тот же префикс, чтобы все эти префиксы были установлены на новые?

Например:

011.foo.txt -> 001.foo.txt
011.bar.psd -> 001.bar.psd
011.баз.gif -> 001.баз.gif
012.qux.js -> 002.qux.js
012.corge.png -> 002.corge.png
...
020.thud.txt -> 010.thud.txt

Я хотел бы использовать команду переименования, если это возможно:

переименовать [-h|-m|-V] [-v] [-0] [-n] [-f] [-d] [-e|-E perlexpr]*|perlexpr [файлы]

Очень ценю вашу помощь в выяснении этого, спасибо!

флаг hr
Вы хотите просто уменьшить числовое значение префикса на 10 в каждом случае?
user10489 avatar
флаг in
Связь между вашими исходными и целевыми числами не ясна. Один вызов команды переименования не сможет выполнить такую ​​сложную манипуляцию. Безопасным подходом к чему-то подобному было бы сгенерировать файл (используя awk? perl?) с несколькими командами mv, изучить результаты и отредактировать любые проблемы, а затем запустить файл.
io4250 avatar
флаг ng
@steeldriver, это интересное решение, о котором я не подумал. Но в идеале я хотел бы, чтобы переименованные файлы начинались с определенной точки (например, 001 или 005) без математических вычислений, если это возможно, чтобы я мог использовать одно и то же решение независимо от начального номера в текущем списке файлов.
io4250 avatar
флаг ng
@user10489 user10489 Извините, я сделал опечатку в своем примере и обновил его (010.thud.txt ранее неправильно назывался 003.thud.txt)
Рейтинг:2
флаг cn

Использование перла переименовать как просили.

Что демонстрирует ваш вопрос:

переименовать -n 's/^(\d+)/sprintf "%03d", $1-10/e' *

выход всухую:

переименовать(011.bar.psd, 001.bar.psd)
переименовать(011.баз.gif, 001.баз.gif)
переименовать (011.foo.txt, 001.foo.txt)
переименовать(012.corge.png, 002.corge.png)
переименовать (012.qux.js, 002.qux.js)
переименовать (020.thud.txt, 010.thud.txt)

Для того, что говорит заголовок вопроса, с фактическими последовательными префиксами:

rename -n -E 'использовать переменные q{$n}' -e 's/^(\d+)/sprintf "%03d", ++$n/e' *
переименовать(011.bar.psd, 001.bar.psd)
переименовать(011.баз.gif, 002.баз.gif)
переименовать (011.foo.txt, 003.foo.txt)
переименовать(012.corge.png, 004.corge.png)
переименовать (012.qux.js, 005.qux.js)
переименовать (020.thud.txt, 006.thud.txt)

Для первого, если вы не хотите жестко кодировать дельту 10:

переименовать -n -E 'использовать переменные q{$delta}' -e '
    с{^(\d+)}{
        $delta = $1 - 1, если не определено значение $delta;
        sprintf "%03d", $1 - $дельта
    }е
' *
Рейтинг:2
флаг hr

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

$ переименовать -n -E '
  НАЧИНАТЬ {
    мой $n = 1;
    наш %pfxs;
    foreach мой $f (@ARGV) {
      $pfxs{$1} = (существует $pfxs{$1} ? $pfxs{$1} : $n++), если $f =~ /^(\d{3})/
    }
  }
  наш %pfxs;
  s/^(\d{3})/sprintf "%03d", $pfxs{$1}/e
' [0-9][0-9][0-9].*
переименовать(011.bar.psd, 001.bar.psd)
переименовать(011.баз.gif, 001.баз.gif)
переименовать (011.foo.txt, 001.foo.txt)
переименовать(012.corge.png, 002.corge.png)
переименовать (012.qux.js, 002.qux.js)
переименовать (020.thud.txt, 003.thud.txt)

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

Это, несомненно, можно улучшить - в частности, можно было бы проверить максимальное значение $n в конце сопоставления и соответственно выберите ширину вывода.

io4250 avatar
флаг ng
Извините, @steeldriver, я сделал ошибку, набрав 003.thud.txt, на самом деле я хотел ввести 010.thud.txt.
флаг hr
@io4250 io4250 tbh Я предположил, что это не имеет особого значения, так как у нас нет `...` частей последовательности
Рейтинг:1
флаг jp

В баш

Попробуйте это (пробный запуск) из каталога, содержащего файлы:

для f в *
делать
    г = "${ф#*.}"
    р="${ф%%.*}"
    если [ "$p" -eq "$p" ] 2>/dev/null
    тогда  
    р="$((10#$р - 10))"
    p="$(printf "%03d" $p)"
    echo mv -- "$f" "$p.$r"
    фи 
сделано

Если вас устраивает распечатанный вывод, измените строку:

echo mv -- "$f" "$p.$r"

к:

mv -- "$f" "$p.$r"

удаление эхо сделать фактическое переименование.

Ответить или комментировать

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