回答:
rename
Ubuntuに同梱されているツールは、この種のものでかなりホットです。次のような小さなPerl式を埋め込むことができます。
rename -n 's/.+/our $i; sprintf("AS%d.txt", 1+$i++)/e' *
それは単にそれが何をするかを示します。を削除し-n
て実弾演習にします。
これは基本的に、変数を大まかに定義し、ヒットした各ファイルをインクリメントすることで機能します。10個を超えるファイルを使用する場合は、でゼロパディングを使用することをお勧めしますsprintf
。以下は次の場合に適してい999
ます。
rename -n 's/.+/our $i; sprintf("AS%03d.txt", 1+$i++)/e' *
...しかし、それは簡単に拡張できます。
オリさん@上の向上のために答え、rename
ツールのバージョン1.600によってアリストテレスPagaltzisは、実際に、内蔵のカウンタを持っています$N
。
必要なのは、
rename 's/AS.*/AS$N/' *
インストールするには、
brew install rename
またはスクリプトをダウンロードする/usr/local/bin/brew
または/usr/bin
)rename
$_
この問題に最適なに直接割り当てることができます。Perl rename
ユーティリティに渡すコード引数は、多くの場合、マッチングと置換(でs/
)を実行しますが、この問題をそのように解決することは完全に許容できますが、実際に調べたり、古いファイル名のテキストを再利用します。を使用すると、ほぼすべての Perlコードを記述できます。内部に埋め込む必要はありません。次のようなコマンドを使用することをお勧めします。rename
s/
/e
rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' *
または、いくつかの文字を削りたいと思うなら:
rename -n '$_ = sprintf "AS%02d.txt", ++our$i' *
(さらに短くすることもできますが、明快さを犠牲にする必要はありません。)
これらのコマンドは両方とも同じことを行います。それぞれは、どのような名前変更操作が行われるかを示しています。試してみて結果に満足したら、-n
オプションなしでもう一度実行してください。書かれたように、これはファイル名生み出すAS01.txt
、AS02.txt
、...、 、AS10.txt
、AS11.txt
など。必要に応じてこれらを変更し、表示され-n
た内容が気に入った場合にのみ削除できます。
2より大きい幅にパディングする場合2
は、大きい数値に置き換えます。何らかの理由でファイル名が好きたい場合たとえば、AS00000000000001.txt
あなたが代わる%02d
と%014d
。あなたはすべてのパディングをしたくない場合-それはあなたが後でそれらを一覧表示したときに、あなたのファイルは、非数値順に表示されますになるだろうにもかかわらず! -あなたは置き換えることができる%02d
だけで%d
。
これはどのように作動しますか?シェルは *
、rename
コマンドを実行する前にファイルのリストに展開します。リストは、現在のロケール設定に従って辞書順に(つまり、アルファベット順に)ソートされます。rename
コマンドライン引数としてファイル名を受け取り、リストされている順に処理します。式++$i
は、変数の現在の値よりも1つ大きい値に評価され$i
、変数$i
をその新しくインクリメントされた値に設定します。この値はに渡されsprintf
、フォーマットされて他のテキスト内に配置されます。このテキストは$_
、ファイル名を保持する特別な変数に直接割り当てられます。以来rename
、彼らは、引数として渡された順にプロセスファイル、彼らはそれに応じて番号が付けられています。
どちらもカウンター変数を宣言およびインクリメントし、両方ともsprintf
基本的に同じ方法で使用して、新しいファイル名の他のテキストに左側にゼロが埋め込まれたカウンターの値を埋め込みます。( -とパディングの幅を変更する-ゼロでパッドにどの程度のいずれかの回答に記載されている情報。でも両方に等しく適用)、彼らはとても似ている理由は、古い答えのメソッドは本当にただやってこのされていることである1が、多くの問題には便利ですが、実際にはこの問題には必要ない追加の手順があります。
比較のために、ここで使用したスタイルを使用するように変更した場合(および、ここでは3の代わりに2の幅にパディングするように変更した場合)、その回答の2番目のコマンドは次のようになります。
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' *
間の部分s/.+/
と/e
、そのコマンドには、現在私が割り当て式と同じである$_
(すなわち、右側のコード=
この回答の最初のコマンドでオペレーター)。
s/
オペレータマッチテキストへの試みは、(ファイル名はシェルから拡大していること*
と、それが走ったコマンドライン引数として渡されたrename
)と、正規表現、および実行する置換。式の/
さまざまな部分を区切るための区切り文字として使用されていs
ます。最初の部分.+
は、正規表現です。それが一致した任意の1つの文字を(.
)、およびそのようにする(1回以上+
)。ファイル名が空になることは決してないので(それらは常に少なくとも1文字長です)、これは任意の1つのファイル名に一致する1つの方法です。our $i; sprintf "AS%02d.txt", ++$i
。これにより、新しいファイル名が生成されます。典型的には、1つの用途s/
のいずれかである農産物のテキストに() 、ファイル名、またはその一部だけ一致したことを置換テキスト(b)は、何らかの方法でマッチしたテキストに基づいて(例えば、それは次のように特殊な変数を使用する可能性$&
への膨張試合)。ただし、この場合、一致したテキストはまったく使用されていません。our $i; sprintf "AS%02d.txt", ++$i
されたテキストはコードとして実行されるのではなく、ファイル名として使用されます。しかし、/e
最後のフラグにより、テキストはPerlソースコードとして扱われ、評価され、その結果生成された値(この場合、Perlの組み込みsprintf
関数の戻り値)が新しいファイル名として使用されます。ここで示した方法は、で使用するどの方法よりもこの問題に対する明確でシンプルなアプローチだと思いますが、他の多くのファイル名変更の問題によく適しているため、その方法を知っておくと良いでしょうまたは元のファイル名の一部が検査および/または保持されます。Oli(この回答も書いた)によるこのブログ投稿をお勧めします。s/
/e
1 技術的には、そこでの動作の違い$_ =
コマンドとs/
/e
コマンド。正規表現では、改行に一致しないため、任意の文字に一致する.+
ことは厳密には真実ではありません。改行を含むファイル名はおそらく使用すべきではありませんが、使用することはできますが、偶然にファイルにそのような名前が付けられることもあります。そのように感じたら、の出力との出力を対比してください。作るために改行と一致し、使用終了(とで行く旗を、)。つまり、の代わりに末尾に書き込みます。.
rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' $'foo\nbar'
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' $'foo\nbar'
.
s
e
/se
/e
rename
はprenameです。これは良いかもしれませんが、インストール手順を追加して、この回答の価値を高めることができます。