ファイル名を変更するスクリプトを作成しています。ファイル名の現在の構文はです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までの数字0
8.
答え2
あるいは、スクリプトを捨て、代わりrename
にツールを使用してください。
rename
残念ながら、ディストリビューションに応じて(少なくとも)2つの異なるインスタンスがあります。一部のシステムでは、Perlのバージョンと呼ばれることがありますprename
。ただし、実行すると、どのバージョンであるかがわかりますrename -n ';' /dev/null
。何も起こらない場合は、Perlバージョンを使用しています。エラーが発生した場合、これは別のエラーです。
現在のファイル名の構文はです
program 1.c
。に変更したいですcprogram-program1.c
。ファイルが9つしかないとしましょう。つまり、0,1,2,3..9
Perlベース
rename
(prename
)rename 's/^/cprogram-/; s/\s//' program\ ?.c
もう一つ
rename
rename -v 'program ' cprogram-program program\ ?.c