複数のファイルを複数のディレクトリにコピー

複数のファイルを複数のディレクトリにコピー

他のディレクトリに多くのファイルをコピーする際に問題があります。よりよく説明します。

私のディレクトリに次のコンテンツがあるとしましょう。

$ ls
file1 file2 file3 file4 file5 dir1 dir2 dir3

1つのコマンドですべてのディレクトリのすべてのファイルをコピーしたいと思います。私は以前試しました:

 echo dir{1..3} | xargs cp file{1..5} '{}' \;

私の意図はxargsにechoのすべてのdir *を処理し、処理された入力のすべてのファイルをコピーするように指示することですが、この方法と同様の方法は機能しません。これは約20のディレクトリに対して繰り返す必要があり、ファイル名が少し​​異なるため、スクリプトの使用を避けたいと思います。したがって、スクリプトではなくコマンドを変更することをお勧めします。

答え1

echo dir[1-3] | xargs -r -n1 cp file[1-5]

答え2

xargsを使って小さな間違いを犯しました。 -n引数がない場合、xargsはecho dir{1..3}各エントリ間に必要なキャリッジリターンを追加せずに入力のすべての引数をコマンドに追加するため、xargsは結果を1つの引数として扱います。

xargs には項目数を制限する -n オプションがあります。ディレクトリを一覧表示するには、\ nまたは\ 0を区切り文字として使用する必要があります。

find . -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -n 1 cp file{1..5}

findコマンドは現在のディレクトリ内のすべてのディレクトリを探し、\ 0を区切り文字として使用しますが(ディレクトリにスペースがある場合はうまく機能します)、xargsは\ 0を区切り文字として使用し、一度に1つの引数で始まります。

答え3

そのような名前がある場合は、次のように動作します。

#!/bin/bash
shopt -s nullglob
for dir in dir*/; do
    cp file* "$dir"
done

名前に関係なく、すべてのファイルをすべてのディレクトリにコピーするには、次の手順を実行します。

#!/bin/bash
shopt -s nullglob dotglob
for dir in */; do
    for file in *; do
        [[ -f $file ]] && cp "$file" "$dir"
    done
done

答え4

ほぼすべて来ました。各ソースファイルのコピーは1つだけ作成されるため、cp各ターゲットディレクトリに対して別々のコマンドを実行する必要があります。cp主な目的xargsは、複数の引数を使用してコマンドを実行することですが、このオプションを使用して一度に1つの項目を渡すように指示できます-n。また;{} ;の構文は;find … -execとともに必要ありません。使用できませんxargs

echo dir{1..3} | xargs -n 1 cp file{1..5}

これは、ディレクトリ名にスペースや文字が含まれていない場合にのみ機能します\'"xargsこれは、これらの文字がファイル名の一部であるかどうかは不明であり、入力ファイルを引用符で囲んだり区切りたりすることができないためです。この問題のない別の方法は、シェルループを使用することです。

for d in dirs{1..3}; do
  cp file{1..5} "$d"
done

これらすべては、ファイルとディレクトリを名前で簡単に区別できると想定しています。そうでない場合は、/末尾に を追加してディレクトリを一致させることができます。たとえば、*/現在のディレクトリのすべてのディレクトリを一致させること、または名前が数字で始まるすべてのディレクトリをfoo[0-9]*/一致させるなどの操作を実行できます。fooほとんどのシェルには、ディレクトリ以外の項目のみを一致させる同様の方法はありませんが、再帰コピーをcp実行するように引数なしでディレクトリを渡すと、そのディレクトリは無視され、エラーメッセージが表示されます。

for d in */; do
  cp * "$d"
done

zshでは利用可能ですグローバル予選特定のファイル形式のみが一致します。

for d in *(/); do
  cp *(.) $d
done

関連情報