Переименуйте все файлы в subdirecories

У меня есть проблема при записи сценария для массового переименования файлов в подкаталогах.

У меня есть папка с несколькими подпапками, и те подпапки имеют несколько файлов, которые я должен переименовать.

Это, где я добрался до сих пор:

for file in $(find -name "*.report")
do
  mv "$file" "LPP_${file/LP_/}"
done

Таким образом, как Вы видите, я должен заменить 'LP _' строка в имени файла с 'LPP _'.

Это не работает из-за пути к файлу - строки, полученные от команды находки, являются только именами файлов и не включают путь. Для включения пути я пробую что-то вроде этого:

for file in $(find -name "*.report")
do
  echo "$file" 
  echo "${RELPATH/\$\//}/${file/LP_/LPP_}"
done

Но переменная RELPATH снабжает префиксом '/' символ, таким образом, команда mv жалуется, что это не может переместить файл в/./subfolder1/LPP_filename.report

Кто-то может сказать мне, что я делаю неправильно, являюсь там лучшим способом сделать его, и объясните, почему там дополнительное '/' символ в te RELPATH переменная и как удалить его?

Спасибо всем заранее!

2
задан 14 November 2014 в 22:16

1 ответ

Я действительно не понимаю Вашу проблему (find должен возвратить полный путь), однако я предлагаю другой подход, возможно, что-то как

find -name '*.report' -execdir bash -c 'echo mv "$0" "${0/LP_/LPP_}"' {} \;

Путем передачи find результат {} как оболочка позиционный параметр $0 подчиненному bash -c команда, мы можем работать вокруг того, что мы не можем сделать mv {} ${{}/LP_/LPP_} непосредственно. Использование -execdir вместо более общего -exec гарантирует, что замена происходит только на части имени файла, в случае, если любой из путей, оказывается, содержит строку LP_

echo именно так, можно испытать его и проверить, что переименование выглядит корректным - необходимо будет удалить его для разрешения фактического переименования.

2
ответ дан 2 December 2019 в 03:58

Другие вопросы по тегам:

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