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

Предполагается, что число, начинающееся с нуля, является восьмеричным числом.
Восьмеричные числа должны иметь цифры в диапазоне от 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
-3
08.08.2019, 09:36
2 ответа

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 {} +
2
28.01.2020, 05:19

Добавление к ответу Стефана Шазела,

вам, возможно, придется использовать кавычки, особенно если какое-либо имя файла содержит пробелы, поэтому old_file_nameстановится 'old_file_name'. Обычно это происходит при работе со многими файлами, используйте '{}'вместо {}. На данный момент я не могу сказать, уместно ли цитирование похвал при использовании опции -execdir.

Кроме того, проверьте справочную страницу find , так как она содержит предупреждение о безопасности, которое, по-видимому, применимо в данном случае.

0
28.01.2020, 05:19

Теги

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