回答:
空のフォルダーを除外するオプション-mがある場合は、cpではなくrsyncを使用することをお勧めします。例:
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が偽であれば真。このキャラクターは通常、シェルによる解釈から保護する必要があります。
-not exprの
と同じ !expr、ただしPOSIX準拠ではありません。
-execdir
オプションのドキュメント:
-exec コマンド;
コマンドを実行します。0ステータスが返された場合はtrue。findに続くすべての引数は、 ';'で構成される引数までコマンドの引数と見なされます 遭遇します。文字列「{}」は、コマンド[...]の引数に出現するすべての場所で処理される現在のファイル名に置き換えられます。これらの構造は両方とも、シェルによる展開から保護するために、エスケープする必要があります( '\'を使用)。指定されたコマンドは、一致したファイルごとに1回実行されます。コマンドは開始ディレクトリで実行されます。-execアクションの使用を取り巻く避けられないセキュリティ問題があります。代わりに-execdirオプションを使用する必要があります。
-execdir コマンド;
-execと似ていますが、指定されたコマンドは、通常は検索を開始したディレクトリではない、一致したファイルを含むサブディレクトリから実行されます。これは、一致するファイルへのパスの解決中に競合状態を回避するため、コマンドを呼び出すためのはるかに安全な方法です。[...]このオプションを使用する場合、$ PATH環境変数が '。'を参照しないようにする必要があります。そうでない場合、攻撃者は-execdirを実行するディレクトリに適切な名前のファイルを残すことで、好きなコマンドを実行できます。同じことは、空または絶対ディレクトリ名ではないエントリが$ PATHにある場合にも当てはまります。
cp
か?私はむしろ、それが何をしているのかをすぐに理解することがより明確なので、それを使用しますが、もちろんそれがそのように使用できない場合、他のオプションを探すことができます。