Я хочу написать скрипт, который найдет все файлы, заканчивающиеся на , .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
, в противном случае,это приводит к уязвимости безопасности.