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

У меня есть каталог, полный файлов с именем

image_1.jpg
image_2.jpg
...
image_10.jpg
...
image_335.jpg

Теперь я хочу использовать инструмент командной строки, который ожидает, что изображения будут расположены в алфавитном порядке. Но алфавитный порядок этих имен файлов: image_100.jpg image_101.jpg ... image_10.jpg image_11.jpg ... image_1.jpg ....

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


person sweiler    schedule 24.08.2015    source источник
comment
Может быть, ваш инструмент просто использует заданный порядок? Например, если вы вызываете его как sometool image*.jpg, вместо этого вы можете просто сделать sometool image_{1..335}.jpg.   -  person that other guy    schedule 24.08.2015
comment
stackoverflow.com/questions/9896070/   -  person bishop    schedule 24.08.2015
comment
@thatotherguy нет, инструмент просто ожидает, что рабочий каталог будет заполнен упорядоченными изображениями :(   -  person sweiler    schedule 24.08.2015
comment
На какой ОС вы это делаете? У вас есть команда rename?   -  person that other guy    schedule 24.08.2015
comment
ls -v * может быть вашим другом, но использование ls для передачи имен файлов всегда сопряжено с другими проблемами.   -  person potong    schedule 25.08.2015


Ответы (2)


С баш:

for i in *; do if [[ $i =~ (image_)([0-9]{1,2})(\.jpg) ]]; then printf -v num "%03d" "${BASH_REMATCH[2]}"; echo mv -v "$i" "${BASH_REMATCH[1]}${num}${BASH_REMATCH[3]}"; fi; done

Если все в порядке, удалите echo.

Протестировано с каталогом с этими именами файлов:

image_100.jpg
image_101.jpg
image_10.jpg
image_11.jpg
image_1.jpg
image_2.jpg
image_334.jpg
image_335.jpg
image_3.jpg

Созданные команды:

mv -v image_10.jpg image_010.jpg
mv -v image_11.jpg image_011.jpg
mv -v image_1.jpg image_001.jpg
mv -v image_2.jpg image_002.jpg
mv -v image_3.jpg image_003.jpg

Результат:

image_001.jpg
image_002.jpg
image_003.jpg
image_010.jpg
image_011.jpg
image_100.jpg
image_101.jpg
image_334.jpg
image_335.jpg
person Cyrus    schedule 24.08.2015

Хорошо, я нашел решение, не используя команду оболочки, а написав простой скрипт ruby:

input = Dir.glob("image*.jpg")

input.each do |name|
  parts = name.split /[_\.]/
  number = parts[1]
  number = number.rjust(3, '0')
  new_name = [parts[0], '_', number, '.', parts[2]].join
  File.rename(name, new_name)
end
person sweiler    schedule 24.08.2015