bash: использование переименования в именах файлов на левой панели с нулем, когда их префикс слишком короткий - PullRequest
1 голос
/ 15 мая 2019

Я использую соглашение об именах с префиксами чисел для отслеживания некоторых файлов.Но у меня заканчивается двухзначный префикс.Итак, вместо 11.abc 12.def я хочу перейти на 011.abc 012.def.У меня уже есть некоторые 013.xxx 014.yyy.

, пробующие это в пустой директории:

touch 11.abc 12.def 013.xxx 014.yyy

ls -1 дает:

013.xxx
014.yyy
11.abc
12.def

Попробуйте # 1:

Это должно соответствовать всему, что начинается с 2 цифр, но не 3.

rename -n 's/^\d\d[^\d]/0$1/' *

Теперь я надеялся, что $1держите матч, как 11, с 0 $ 1, дающим мне 011.

Нет такой удачи:

Use of uninitialized value $1 in concatenation (.) or string at (eval 2) line 1.
'11.abc' would be renamed to '0abc'
Use of uninitialized value $1 in concatenation (.) or string at (eval 2) line 1.
'12.def' would be renamed to '0def'

С положительной стороны, он готов оставить 013 и 014 в покое.

Попробуйте # 2 rename -n 's/^\d\d[^\d]/0/' *

'11.abc' would be renamed to '0abc'
'12.def' would be renamed to '0def'

Поскольку это основано на регулярных выражениях, могу ли я каким-то образом сохранить группу совпадений 11 и 12?

ЕслиЯ не могу использовать переименование, я, вероятно, напишу быстрый скрипт на Python.Не хочу зацикливаться на mv.

И, собственно, мое соглашение об именах состоит из 2-3 цифр, за которыми следует точка, так что это тоже хорошее совпадение.

rename -n 's/^\d\d\./<whatever needs to go here>/' *

Для чего я стою, я использую версию переименования Homebrew, как и на Mac.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

rename проблематично, потому что он не является частью POSIX (поэтому он обычно не доступен во многих Unix-подобных системах), и его широко используют в двух разных формах. См. Почему утилита переименования в Debian / Ubuntu отличается от утилиты в других дистрибутивах, например, CentOS? для получения дополнительной информации.

Этот код Bash выполняет переименование с помощью mv (который является частью POSIX):

#! /bin/bash -p

shopt -s nullglob  # Patterns that match nothing expand to nothing.

for f in [0-9][0-9].* ; do
    mv "$f" "0$f"
done
  • shopt -s nullglob предназначен для предотвращения проблем, если код запускается в каталоге, в котором нет файлов, которые необходимо переименовать. Если nullglob не включен, код попытается переименовать файл с именем [[0-9] [0-9]. * ', Что приведет к нежелательным последствиям, независимо от того, существует ли такой файл.
1 голос
/ 15 мая 2019

попробуйте это:

rename 's/^(\d{2}\..*)/0$1/' *
...