この質問は、前の質問に対する後続の質問です。以下を使用して多数のディレクトリを作成します。mkdir
。
シェルを使用していますbash
。次のコマンドを使用して、それぞれプレフィックス "s"で始まる50のディレクトリを作成しました。
mkdir $(printf "s%02i " $(seq 1 50))
2番目の数字までゼロで埋めます。つまり、私が得たディレクトリはs01
、、、s02
...、、s49
の形ですs50
。
今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.
答え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]'
一致の後にはs
2つの数字が続きます。これは、何らかの理由であれば、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/s01
etc /my/50dirs/path/s02
)があると仮定すると、次のようになります。
seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}