tar 本当に速くあなたのためにこれを行います。
テスト
まず、2つのディレクトリと10個のファイルを作成しました。
% mkdir test1 test2 ; cd test1
% for n in `seq 1 10` ; do touch ABC.file$n ; done
% ls
> ABC.file1 ABC.file2 ABC.file4 ABC.file6 ABC.file8
> ABC.file10 ABC.file3 ABC.file5 ABC.file7 ABC.file9
それから私はそれらをコピーしました:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC/DEF/' -xf -
% ls ../test2
> DEF.file1 DEF.file2 DEF.file4 DEF.file6 DEF.file8
> DEF.file10 DEF.file3 DEF.file5 DEF.file7 DEF.file9
変換
したがって、GNU tarはsed --transform=EXPRESSIONファイル名の変更を受け入れます。これにより、一部のファイルの名前だけを変更することもできます。例えば:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC\(.*[0-5]\)/DEF\1/' -xf -
% ls ../test2
> ABC.file6 ABC.file8 DEF.file1 DEF.file2 DEF.file4
> ABC.file7 ABC.file9 DEF.file10 DEF.file3 DEF.file5
それが一つの利点です。
ストリーム
また、これは2つのtarプロセスのみであり、ファイル数に関係なく変更されないことを考慮してください。
tar | tar
tarあなたが望むように最適化されています。これにより、問題のある引数カウントや子プロセスの暴走が発生することはありません。これは、A> B完了です。
引数
tarここでは、2つのプロセス間で組み合わせた7つの異なる引数を使用します。最も重要なものを最初にここにリストします。
-stdout / stdin-これは、アーカイブを構築または抽出しているかどうかに応じてtar、入力または出力をストリーミングすることを通知しstdin/stdoutます。
-ccreate-tarアーカイブを構築するよう指示します。tar期待される次の引数は...
-fファイル - テープデバイスなどではなくtar、fileオブジェクトで動作することを指定します。そして、上で述べたように、それが動作するファイルはstdin/stdout-つまり、私たちの|pipe。
./*すべての$ PWD / files-アーカイブ引数が最初に来ることを除いて、ここでは説明しすぎないよう-にし./*ます。
...そしてその反対側に|pipe...
-Cディレクトリの変更 -これはtar、他のアクションを実行する前に指定したディレクトリに変更する必要があることを通知するため、cd ../test2抽出の直前に効果的に実行します。
--transform='s/ed/EXPR/'-すでに述べたように、これは名前を変更しました。しかし、ドキュメントでは、任意のsed式またはを使用できることが示されています//flag。
-x抽出 - tarターゲットディレクトリを変更し、名前の変更指示を受け取った後、-f - |pipeアーカイブファイルから現在のディレクトリにすべてのファイルの抽出を開始するよう指示します。ミステリーはありません。
mcファイルマネージャーは、この種の一括名前変更を最も広範囲にサポートしています。