Объединение базового имени {} и операций со строками в bash

Объединение базового имени {} и операций со строками в bash

Я хочу написать скрипт, который найдет все файлы, заканчивающиеся на , .cppи переименует их в .cc. Поиск будет выполняться рекурсивно от начального маршрута R, который является аргументом скрипта.

Если аргумент не указан, R будет фактическим каталогом.

И я написал:

#!/bin/bash

R=.
if [[ $# == 1 ]]
then
    echo "$# == 1"
    if [[ -d $1 ]]
    echo "$1 is directory"
    then
        R=$1
    else
        printf "Error $1 should be a directory"
        exit 1
    fi
find $R -name "*.cpp" -exec sh -c 'mv {} $(dirname {})${$(basename {})%.cpp}".cc" ' \;
exit 0
else
    printf "Invocation is: $0 directory"
    exit 1
fi

Но я знаю, что у меня проблемы с поиском, потому что я не знаю, как выразитьЯ хочу удалить расширение и добавить новое при использовании {}

решение1

Не делайте этого, работая напрямую с {}.

Вы использовали inline sh, поэтому передайте {}ему в качестве аргумента, и вам вообще не нужно использовать basename:

find "$R" -name "*.cpp" -type f -exec sh -c '
  for f do
    mv -- "$f" "${f%.*}.cc"
  done
' sh {} +

Обратите внимание, что вам необходимо использовать двойные кавычки $R, в противном случае,это приводит к уязвимости безопасности.

Связанный контент