Bashスクリプトでファイル名を変更する

Bashスクリプトでファイル名を変更する

ファイル名を変更するスクリプトを作成しています。ファイル名の現在の構文はですprogram 1.c。に変更したいですcprogram-program1.c

この形式を取得できません。単純化のためのいくつかの条件は次のとおりです。

  • 10個のファイル、つまり0,1,2,3..9しかないとします。

これを達成するための私のプログラムは次のとおりです。

  • まず、特定のパターンに従うファイルを見つけるためにファイルをフィルタリングする必要があります。

  • 次に、ファイル名を部分文字列無視者でフィルタリングして正しい形式であることを確認する必要があります。

  • 形式が正しい場合は、必要な方法でファイル名を編集できます。

1段階と2段階で詰まっています。私がしていることは次のとおりです。

for fn in *; do --> this loops over the files 
 program=${fn:0:7}
 number=${..} --> number between 0 and 9
 extension=${..} --> gets file extension like .c

if [ "$program" == "program"  ]
 then
    if [ "$number" -ge 0 ] && [ "$number" -le 9 ]
     then

         if [ "$extension" == ".c" ]
          then
            --> edit code 
          fi

     fi
fi
done

私の質問:上記の例をいくつかの順列で試しましたが、欲しいものを得ることはできません。助け、簡単なアプローチを高く評価します。

ありがとう

答え1

for fn in *
do  case $fn in
    (program*[1-8].c)
        : do something;;
    (other*program*[09].ext)
        : do something with this match;;
    (this*match|*or*|*any*"$of"*these*matches)
        : do something with these matches
        : do as many lines as you want;;
    (*) : catch all last default match
    esac
done

ステートメントの一般的な技法は、通常、必要なcaseものよりも具体的なパターンで不要な一致を切り取ることです。たとえば、

for fn in *
do  case $fn in
    (*[0-9][0-9].c) ;;
    (program*[1-8].c)
        echo mv "$fn" "${fn%???}0${fn#"${fn%???}"}"
    esac
done

上記の例では、最初のパターン*[0-9][0-9].cは、$fn拡張子の左側に複数の数字が表示される可能性があるすべての値と一致します。これらの一致の実行ブロックは空であり、一致が見つかった場合は何も起こりません。ただし、最も重要なことは、caseステートメントがトップダウンとして機能するため、アクションブロックと一致する唯一の結果には、拡張子の左側にある1つの数字だけが含まれ、例のコマンドは、各出現の前に数字をecho挿入することを意味します。 1から1までの数字08.

答え2

あるいは、スクリプトを捨て、代わりrenameにツールを使用してください。

rename残念ながら、ディストリビューションに応じて(少なくとも)2つの異なるインスタンスがあります。一部のシステムでは、Perlのバージョンと呼ばれることがありますprename。ただし、実行すると、どのバージョンであるかがわかりますrename -n ';' /dev/null。何も起こらない場合は、Perlバージョンを使用しています。エラーが発生した場合、これは別のエラーです。

現在のファイル名の構文はですprogram 1.c。に変更したいですcprogram-program1.c。ファイルが9つしかないとしましょう。つまり、0,1,2,3..9

  1. Perlベースrenameprename

    rename 's/^/cprogram-/; s/\s//' program\ ?.c
    
  2. もう一つrename

    rename -v 'program ' cprogram-program program\ ?.c
    

関連情報