cpを使用して単一のファイルを複数のディレクトリにコピーする


12

この質問は、以前の質問「を使用して多数のディレクトリを作成する」の続きmkdirです。

bashシェルを使用しています。次のコマンドを使用して、それぞれが接頭辞「s」で始まる50個のディレクトリを作成しました。

mkdir $(printf "s%02i " $(seq 1 50))

2番目の桁にゼロが埋め込まれます。つまり、私が取得ディレクトリの形式はs01s02、...、 、。s49s50

ここで、50個のディレクトリのそれぞれにcp単一のファイル(たとえば、test.txt)をコピーするために使用したいと思います。上記と同様の方法でこれを行うことは可能ですか?たとえば、次のように動作しますか?私はUnix / Linuxに比較的慣れていないので、誰かが私にそれが安全であるという指示を与えてくれるまで、私は本当にこれを試してみたいとは思いません。

cp test.txt $(printf "s%02i.txt" $(seq 1 50))

manページを見ると、次のcpようなcp複数の宛先をサポートしているようには見えませんが、

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

回答:


7

コマンドの出力を使用して、を使用して各ディレクトリにファイルをコピーするcp場合は、いつでも次の場所にパイプできますxargs

printf "s%02i " $(seq 1 50) | xargs -n 1 cp test.txt

出力を解析することの安全性について心配する必要はありません。出力前にその形式と内容を知っているからです。ファイル名にメタ文字やスペースが含まれるリスクは、実際にはここでは問題になりません。

または、ディレクトリがすでに存在すると仮定すると、次のようなものを試すことができます:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -print0 | xargs -0 -I {} cp test.txt {}

またはパイプなし:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -exec cp test.txt {} \;

最後の2つのコマンドは、現在のディレクトリ内のファイルを検索cp test.txtします。この-maxdepth 1オプションは、ファイルを受信するサブディレクトリも回避します。その警告さ's[0-9][0-9]'に対するマッチングでs、あなたが持っているいくつかの理由でどの手段であれば、任意の2桁の数字が続くs99中でcwd、それはまたのコピーを受信しますtest.txt


8

forループでシェルに反復を実行させることもできます。これは、parallelやなどの外部ツールに依存しない最も基本的な方法でありxargs、理解しやすいと思います。

for name in $(printf "s%02i " $(seq 1 50)); do
    mkdir $name
    cp test.txt $name
done

これを書く方法は他にも100万通りあります。例えば:

for name in $(seq -w 1 50); do
    mkdir s$name
    cp test.txt s$name
done

実行する前に何を実行するかを確認する場合は、コマンドの前にを追加するなどecho、行を実行せずに出力します。

for name in $(seq -w 1 50); do
    echo mkdir s$name
    echo cp test.txt s$name
done

出力:

mkdir s01
cp test.txt s01
mkdir s02
cp test.txt s02
mkdir s03
cp test.txt s03
# etc.


2

GNU parallelも使用できます。あなたはTEXT.TXTを含むディレクトリにあり、あなたの50件のdirsはに位置していると仮定すると/my/50dirs/path(のような/my/50dirs/path/s01/my/50dirs/path/s02あなたが実行しますなど):

seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}

2
parallel -j1そうしないと、コアごとに1つのジョブが存在し、マルチコアマシンではジョブがIOを競います。
ジル 'SO-悪であるのをやめる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.