Как переименовать к фиксированной длине

Необходимо выполнить команду updatedb как суперпользователь. Например,

sudo updatedb
5
13.04.2017, 15:36
4 ответа

Если в вашей системе используется команда переименования на основе perl, вы можете сделать что-нибудь вроде

rename -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg

Тестирование с помощью опций -v (подробный) и -n (без опции):

$ rename -vn -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg
0-10.jpg renamed as 0-010.jpg
0-19.jpg renamed as 0-019.jpg
0-1.jpg renamed as 0-001.jpg
9
27.01.2020, 20:32

Вот другой подход. Так как вам нужно переименовать только определенное подмножество файлов и так как вы уже знаете, что это такое, просто перечислите их и переименуйте:

for i in {1..99}; do mv -- 0-$i.jpg 0-$(printf '%03d\n' $i).jpg; done

Это перечислит числа от 1 до 99, сохранив каждое значение как $i. Остальное вас не волнует, так как они уже правильно названы. Затем вы переименовываете 0-$i.jpg в мягкую версию. Директива printf %03d выведет число, добавляющее 0s слева, если оно меньше 3 символов. В результате все проблемные файлы будут переименованы.

1
27.01.2020, 20:32

другое решение, если у вас нет «переименовать:

for file in *.jpg; do
   [ -f "$file" ] || continue  #skips if no jpg file present in current dir
   echo "${file}" | awk -F'[-.]' '
      {   new=sprintf("%03d",$2); 
          print "echo TESTING mv ", $0," ",$1"-"new"."$3 
      }'
done | bash

(редактировать: перемещен | bash , поэтому он вызывается только один раз, а не один раз для каждого файла. И этот быстрый цикл не является дружественным к "странным именам файлов", но его можно обработать дальше (для обработки файлов с пробелами и т. д.)

и удалить 2 слова повторяют ТЕСТИРОВАНИЕ , чтобы действительно выполнить mv ... , если вы уверены, что он делает то, что вы хотите.

2
27.01.2020, 20:32

Если у вас ZSH Shell, вы можете сделать что-то вроде ниже.

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

Тестирование

touch 0-1.jpg
touch 0-23.jpg
touch 0-345.jpg
touch 0-6.jpg
touch 0-05.jpg

Измените оболочку в ZSH , а если ZMV не загружено, вы можете сделать Autoload ZMV .

Теперь вы можете добавить -N -N флаг в команду ZMV , чтобы увидеть, что произойдет, если вы выполняете команду ZMV . Я запускаю команду как,

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

Вывод - это,

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
mv -- 0-05.jpg 0-005.jpg
mv -- 0-1.jpg 0-001.jpg
mv -- 0-23.jpg 0-023.jpg
mv -- 0-6.jpg 0-006.jpg

Если вы удовлетворены, что имена файлов переименовываются правильно, вы можете удалить флаг -N .

Ссылки

Благодаря пользователю GNOUC для разъяснения моих сомнений в этом вопросе, который я разместил в качестве другого вопроса, чтобы получить это решение, и ссылка на ответ GNOUC - это это .

3
27.01.2020, 20:32

Теги

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