cp の代わりに rsync を使用することをお勧めします。空のフォルダーを除外するオプション -m がある場合は、次のようにします。
rsync -am <origin> <destination>
コマンドの説明は Explainshell.com にあります
-a オプションを使用しているのは、多くの優れたデフォルト アクションを実行するためですが、再帰モードのみを設定する -r オプションを使用することもできます。
[コメントを追加]
cp でこれを行う方法を知りません。少なくとも man ページには、それを行うオプションが表示されていません。コマンド find
を使用して、より複雑なソリューションを実行できる可能性があります。 コピーするファイル/ディレクトリのリストを見つけてからcpに渡しますが、それはrsyncよりもはるかに複雑です. rsync は、多くの Linux でほぼ標準です
cp
確かにファイルのみを取得するオプションはありませんが、berserck が言ったように、 find
を使用できます cp
と一緒に .実際、これは非常に簡単です:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
または:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
説明
find
必要なファイルを探すツールです。最初のオプションでは、-type f
を設定します 通常のファイルのみを返します。 2 番目のオプションでは、-not -type d
を設定します。 ディレクトリ以外のすべてを取得します。 find
-execdir
に渡された引数を実行します {}
を置き換える 一度に 1 つの結果エントリで、;
のときにコマンドを停止します が見つかりました (;
\;
でエスケープする必要があります または ";"
、またはシェルが展開する可能性があります)。
-execdir
ファイルのフォルダを「作業ディレクトリ」としてコマンドを実行します。これは -exec
の代わりに推奨されます 、以下をチェックしてください。
-type
オプションのドキュメント:
-タイプ c
ファイルのタイプは c:
b:ブロック (バッファ) スペシャル
c:文字 (バッファなし) スペシャル
d:ディレクトリ
p:名前付きパイプ (FIFO)
f:通常ファイル
l:シンボリック リンク。シンボリック リンクが壊れていない限り、-L オプションまたは -follow オプションが有効な場合、これは当てはまりません。 -L が有効なときにシンボリック リンクを検索する場合は、-xtype を使用してください。
s:ソケット
D:ドア (Solaris)
-not
オプションのドキュメント:
! expr
expr が false の場合は true。通常、この文字はシェルによる解釈からの保護も必要です。
-not expr
と同じ ! expr ですが、POSIX 準拠ではありません。
-execdir
オプションのドキュメント:
-exec コマンド;
コマンドを実行; 0 ステータスが返される場合は true。以降の find の引数はすべて、「;」で構成される引数まで、コマンドの引数と見なされます。遭遇します。文字列 '{}' は、コマンド [...] の引数に出現するすべての場所で、処理中の現在のファイル名に置き換えられます。これらの構造は両方とも、シェルによる展開から保護するために ('\' で) エスケープするか、引用符で囲む必要がある場合があります。指定されたコマンドは、一致したファイルごとに 1 回実行されます。コマンドは開始ディレクトリで実行されます。 -exec アクションの使用には、避けられないセキュリティ上の問題があります。代わりに -execdir オプションを使用してください。
-execdir コマンド;
-exec と同様ですが、指定されたコマンドは、一致したファイルを含むサブディレクトリから実行されます 、これは通常、検索を開始したディレクトリではありません。これは、一致したファイルへのパスの解決中に競合状態を回避するため、コマンドを呼び出すためのはるかに安全な方法です。 [...] このオプションを使用する場合は、$PATH 環境変数が「.」を参照していないことを確認する必要があります。そうしないと、攻撃者は、-execdir を実行するディレクトリに適切な名前のファイルを残すことで、任意のコマンドを実行できます。 $PATH に空または絶対ディレクトリ名ではないエントリがある場合も同様です。
https://linux.die.net/man/1/find