
名前が正しくないファイルが複数あります。
$ ls
devoirNote1_1_2.R devoirNote1_1_5.R devoirNote1_4_1.R
devoirNote1_1_3.R devoirNote1_1.R devoirNote1.R
devoirNote1_1_4.R devoirNote1_2_1.R example140.R
devoirNote1_i_j.R
iとjの整数をdevoirNote1_4_1.R
除くすべてを変更したいですdevoirNote1_{i+1}_j.R
(ただdevoirNote1_4_1.R
同じままにしてください)。
mv
同様のコマンドを使用しようとしましたが、複数のmv devoirNote1_*_2.R devoirNote1_2_2.R
ファイルが一致する場合(たとえば、ifとdevoirNote1_1_2.R
その両方が存在する場合)、devoirNote1_3_2.R
問題が発生します。
それでは、ファイル名の変数全体の代わりに1つの変数を増やしてファイル名を変更するスクリプトやコマンドラインをどのように作成しますか?
答え1
Perlのrename
ユーティリティ(*)はこの目的に使用できます。与えられたPerlコマンドを与えられた各ファイル名に適用し、コマンドが名前を変更した名前にファイル名を変更します。
したがって、_1_
glob_2_
に一致するすべてのファイルが変更されます。
rename 's/_1_/_2_/' devoirNote1_*_2.R
/e
置換部分がリテラルテキストではなくPerlフラグメントになるように、置換コマンドを変更して数字を増やすことができます。
rename -v 's/_(\d+)_/"_" . ($1 + 1) . "_"/e' devoirNote1_*_2.R
下線の間に数字を含むファイル名の部分を選択し、数字をキャプチャし$1
、数字を増分数字に置き換えて、下線を追加します。-v
詳細モードの場合。例のファイルリストを使用すると、期待devoirNote1_1_2.R renamed as devoirNote1_2_2.R
どおりに印刷されます。
影響を受けるファイルは、コマンドラインの末尾にあるglobと一致するファイルです。
1_1_2
ただし、たとえば、およびがある場合、1_2_2
最初の名前を変更すると、次の名前と競合するため失敗します。これを行うには、ファイル名を逆の順序で指定するか、最初に競合しない形式に変更してから、追加の文字を追加して元に戻す必要があります。
答え2
2つの(バッチ)移動に対して1つのスクリプトが重複しています。このmmv
ユーティリティを使用してください。
mmv devoirNote1_2_"*" devoirNote1_3_#1
mmv devoirNote1_1_"*" devoirNote1_2_#1
もちろんその順番です。複数のタスクがある場合、スクリプトは実際には良くなります。
答え3
ここでは、フィルタを使用してnegative lookaheads
検索リストからファイルをフィルタリングします。*Note1_3_2.R
*Note1_4_2.R
OPは*Note1_4_2.R
そのままにしたい。 =>古いファイルにも触れることはできません。つまり、*Note1_3_2.R
これをmvする場所がないからです。
ループfor
ロジックは1と2の間のインデックス番号に対して実行されるため、reverse numeric sort
非破壊的なmv操作を実行できます。
perl -e '
/(.*)_(\d+)_(.*)/ and
rename $_, join "_", $1, $2+1, $3 or warn "Could not mv the file <<$_>>\n"
for
map { $_->[0] }
sort { $b->[2] <=> $a->[2] || $b->[1] <=> $a->[1] }
map { [$_, /_(\d+)_(\d+)/] }
grep { /^devoirNote1_(?![34]_1.R)\d+_\d+.R/ }
<*.R>
'