Мое решение заменяет числа, везде в строке
for f in * ; do
number=`echo $f | sed 's/[^0-9]*//g'`
padded=`printf "%04d" $number`
echo $f | sed "s/${number}/${padded}/";
done
Вы можете легко попробовать его, поскольку он просто печатает преобразованные имена файлов (операции с файловой системой не выполняются).
Пояснение:
Цикл по списку файлов
Цикл: for f in * ; do ;done
, перечисляет все файлы и передает каждое имя файла как переменную $f
в тело цикла.
Получение номера из строки
С помощью echo $f | sed
мы передаем переменную $f
в sed
программу.
В команде sed 's/[^0-9]*//g'
, часть [^0-9]*
с модификатором ^
указывает на совпадение с цифрой 0-9 (не цифрой) и затем удаляет ее с пустой заменой //
. Почему бы просто не удалить [a-z]
? Поскольку имя файла может содержать точки, тире и т. Д. Итак, мы удаляем все, что не является числом, и получаем число.
Затем мы присваиваем результат переменной number
. Не забудьте не ставить пробелы в присваивании, например number = …
, потому что у вас другое поведение.
Мы присваиваем результат выполнения команды переменной, оборачивая команду символами обратной черты `.
Нулевое заполнение
Команда printf "%04d" $number
изменяет формат числа на 4 цифры и добавляет нули, если наш номер содержит менее 4 цифр.
Замена числа на набранное нулями число
Мы снова используем sed
с командой замены, например s/substring/replacement/
. Чтобы интерпретировать наши переменные, мы используем двойные кавычки и подставляем наши переменные таким образом ${number}
.
Приведенный выше скрипт просто печатает преобразованные имена, поэтому давайте выполним реальную работу по переименованию:
for f in *.js ; do
number=`echo $f | sed 's/[^0-9]*//g'`
padded=`printf "%04d" $number`
new_name=`echo $f | sed "s/${number}/${padded}/"`
mv $f $new_name;
done
Надеюсь, это кому-нибудь поможет.
Я потратил несколько часов, чтобы понять это.