Предполагается, что число, начинающееся с нуля, является восьмеричным числом.
Восьмеричные числа должны иметь цифры в диапазоне от 0 -до 7 (без 8 или 9 ).
Таким образом, число 9 в 0039
«слишком велико для основания»
Однако это работает, (предполагая, что 0039 является шестнадцатеричным числом):
$ echo $((0x0039))
57
Если вы хотите преобразовать число, выполните:
$ number=0039
$ printf 'octal=%o decimal=%d hexadecimal=%x\n' "$((0x$number))"{,,}
octal=71 decimal=57 hexadecimal=39
perl
варианты rename
сначала принимают в качестве аргумента некоторый perl
код для преобразования имен файлов и списка файлов.
В вашей попытке вы вызываете это с помощью old_file_name
(, что как код perl
не имеет большого смысла; без use strict
он будет обрабатываться так же, как "old_file_name"
, и не будет иметь никакого эффекта )и new_file_name
и файл, найденный find
, в качестве аргументов файла для переименования.
Здесь вы можете просто:
find. -depth -name old_file_name -execdir mv old_file_name new_file_name \;
-execdir
не является стандартным, но довольно распространенным. По сравнению с -exec
он выполняет команду в родительском каталоге каждого выбранного файла вместо текущего рабочего каталога процесса find
.
Без -execdir
можно обойтись:
find. -depth -name old_file_name -exec sh -c '
for file do
mv "$file" "${file%/*}/new_file_name"
done' sh {} +
Добавление к ответу Стефана Шазела,
вам, возможно, придется использовать кавычки, особенно если какое-либо имя файла содержит пробелы, поэтому old_file_name
становится 'old_file_name'
. Обычно это происходит при работе со многими файлами, используйте '{}'
вместо {}
. На данный момент я не могу сказать, уместно ли цитирование похвал при использовании опции -execdir
.
Кроме того, проверьте справочную страницу find , так как она содержит предупреждение о безопасности, которое, по-видимому, применимо в данном случае.