У меня есть проблема при записи сценария для массового переименования файлов в подкаталогах.
У меня есть папка с несколькими подпапками, и те подпапки имеют несколько файлов, которые я должен переименовать.
Это, где я добрался до сих пор:
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 переменная и как удалить его?
Спасибо всем заранее!
Я действительно не понимаю Вашу проблему (find
должен возвратить полный путь), однако я предлагаю другой подход, возможно, что-то как
find -name '*.report' -execdir bash -c 'echo mv "$0" "${0/LP_/LPP_}"' {} \;
Путем передачи find
результат {}
как оболочка позиционный параметр $0
подчиненному bash -c
команда, мы можем работать вокруг того, что мы не можем сделать mv {} ${{}/LP_/LPP_}
непосредственно. Использование -execdir
вместо более общего -exec
гарантирует, что замена происходит только на части имени файла, в случае, если любой из путей, оказывается, содержит строку LP_
echo
именно так, можно испытать его и проверить, что переименование выглядит корректным - необходимо будет удалить его для разрешения фактического переименования.