ファイル名のプレフィックスと中間部分にファイル名を変更します。

ファイル名のプレフィックスと中間部分にファイル名を変更します。

ある時点で、以下を実行するスクリプトがあります。

for src in $(find -H "$ROOT_DIR" -maxdepth 5 -name '*.test' -not -path '*.git*')
  do
    fixed_filename=$(echo "$(basename "${src%.*}")" | sed 's/-test//')

デフォルトでは、次のファイルがあります。thing-test.js.test

繰り返してファイル名で終わりたいです。thing.js

最終的には、次のようにファイルのフルパスを作成します。path="$ROOT_DIR"/"$fixed_filename"

~上〜らしい動作しますが、確かに正確ではありません。私は熱心なshellcheckユーザーであり、役に立たないエコーがあることを知らせて(同意し)、${variable//search/replace}できるだけ試してみます。

これが上記の内容を整理するのに役立つことを願っています。

編集する:

私がしたいことの基本的なポイントは次のとおりです。

特定のファイル名パターンに従ってディレクトリ内のすべてのファイルを再帰的に検索しようとしています。たとえば、これらのファイルの内部にはプレースホルダ変数があります。たとえば、これらすべてのファイルを見つけて、ユーザーが提供した文字列に1つずつ置き換えたいfile-test.js.testとします。 bashスクリプト呼び出し中にファイル名を削除したいです。REPLACEMEREPLACEMEfile.js-test.test

ベストアンサー1

たとえば(以前の拡張子がわからない場合)stuff-X.js.testに名前を変更するには、複数の式を使用して目的の部分を抽出する必要があります。たとえば、パスを頭と尾で分割し、ダッシュの前と中央の文字列を取得します。たとえば、この抜粋では、新しい拡張子は次のようになります。stuff.js.testh=${path%/*}t=${path##*/}${t%%-*}noext=${t%.*}ext=${noext##*.}

find . -name '*-*.test' -exec sh -c 'h=${1%/*}; t=${1##*/}; noext=${t%.*};\
ext=${noext##*.}; fixed=${h}/${t%%-*}.${ext}; echo mv "$1" "$fixed"' sh {} \;

おすすめ記事