在bash中結合basename {}和string的操作

在bash中結合basename {}和string的操作

我想編寫一個腳本來查找所有以 結尾的文件.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,否則,它導致安全脆弱。

相關內容