У меня есть ряд папок, которые я хотел бы переименовать с номером префикса и текстом с разделителями. Например:
% ls
blue green keyboard pictures red tango yellow
flyer gum orange pop runner videos
переименовать в:
% ls
001-blue 002-green 003-keyboard 004-pictures 005-red 006-tango 007-yellow
008-flyer 009-gum 010-orange 011-pop 012-runner 013-videos
Я использую следующее для переименования, за исключением того, что после 009 у меня есть 0010, 0011 и так далее. Я хотел бы сохранить номера префиксов до 3 цифр.
% i=0; for x in *; do; mv "$x" "00$i-$x" ; i=$((i + 1)); done
Я знаю, что проблема в команде mv
из-за жестко запрограммированного 00
в имени получателя, но я не знаю, как изменить его на трехзначное эксклюзивное имя получателя с помощью переменной $i
.
Заранее спасибо.
Используйте этот однострочный Perl:
perl -le '$cmd = sprintf( "mv $_ %03d-$_", ++$i ) and system $cmd for @ARGV;'
Чтобы выполнить пробный запуск и распечатать нужные команды без переименования файлов, используйте print
вместо system
, например:
perl -le '$cmd = sprintf( "mv $_ %03d-$_", ++$i ) and print $cmd for @ARGV;'
Однострочник Perl использует следующие флаги командной строки:-e
: говорит Perl искать код в строке, а не в файле.-l
: удалите разделитель строк ввода (по умолчанию "\n"
в *NIX) перед выполнением кода в строке и добавьте его при печати.
См. также документы для sprintf.
printf "%03d-%s\n" $i, $fname
поможет вам начать. Просто повторите результаты в терминале, пока не убедитесь, что он работает должным образом,your stuff script | bash
чтобы переименовать их все. Удачи.