異なる名前の一連のファイルをコピーして貼り付けます


10

という名前のテキストファイルがたくさんあります

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

各ファイルをコピーして(元のファイルを保持して)、別の名前(同じフォルダ内)に貼り付けたいのですが、

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

簡単なスクリプトを使用してこれを行うにはどうすればよいですか?

回答:


13

元のファイルがある場所にディレクトリを変更します。

次に、次のコマンドラインでテストします。

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

見た目が良ければ、削除echoしてコピーします。

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done

8

パッケージmcpから次のように使用できます。mmvmmvをインストールする

mcp "*original*" "#1copy#2"

これにより、文字列「original」を含むすべてのファイルが現在のディレクトリにコピーされ、この文字列が「copy」に置き換えられます。フラグをmcp追加することで何が行われるかをテストでき-nますが、警告なしにファイルが上書きされることはありませんが、尋ねられます。を使用すると、1つのファイルごとに呼び出す必要がないmmvという利点がcpあります。コピーしたように見えるファイルが1000個あるため、違いが生じます。

以下の方法でGNUparallel 並列インストールを使用することもできます(--dry-runテスト用であり、削除してコピーを実行します)。

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

または、「引数リストが長すぎます」エラーが発生した場合:

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

実行例

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

それではtime遅いマシンでそれぞれ100 KiBの1000以上のファイルを実行してみましょう。

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.