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

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

この質問は、前の質問に対する後続の質問です。以下を使用して多数のディレクトリを作成します。mkdir

シェルを使用していますbash。次のコマンドを使用して、それぞれプレフィックス "s"で始まる50のディレクトリを作成しました。

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

2番目の数字までゼロで埋めます。つまり、私が得たディレクトリはs01、、、s02...、、s49の形ですs50

cptest.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.

答え1

forループを介してシェルを繰り返すこともできます。これは最も基本的なアプローチであり、parallel外部ツールなどに依存せず、xargs理解するのが最も簡単だと思います。

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

次のように書く方法は何百万ものあります。

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

実行する前に実行する内容を確認するには、コマンドの前にthisを追加すると、実行するのではなく行が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

コマンドの出力を使用してファイルを各ディレクトリにコピーするには、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]'一致の後にはs2つの数字が続きます。これは、何らかの理由であれば、s99コピーcwdも受け取ることを意味しますtest.txt

答え3

これによると:https://stackoverflow.com/questions/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-commandファイルを複数の宛先にコピーできません。これを行う別の方法が表示されますので、リンクを確認してください。

答え4

GNUを使用することもできます平行線。現在text.txtを含むディレクトリにあり、50個のディレクトリ/my/50dirs/path(例:/my/50dirs/path/s01etc /my/50dirs/path/s02)があると仮定すると、次のようになります。

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

関連情報