cpのみのファイル、ディレクトリをスキップ


3

cpを使用して、空のディレクトリが含まれているディレクトリからファイルをコピーすると、エラー戻り値が返され、スクリプトが失敗します。

エラー戻り値なしでディレクトリをスキップする方法はありますか?エラー値にエラーを反映させたいのですが、そこに空のディレクトリがある場合は、エラーとして報告されることなくスキップする必要があります。

再帰フラグを追加でき-rますが、ディレクトリをコピーたくないだけで、エラーを報告たい場合はどうすればよいですか?

回答:


2

空のフォルダーを除外するオプション-mがある場合は、cpではなくrsyncを使用することをお勧めします。例:

rsync -am <origin> <destination>

explainshell.comのコマンドの説明

-aオプションを使用しているのは、多くの素晴らしいデフォルトアクションを実行するためですが、必要に応じて-rオプションも使用できる場合は、再帰モードのみが設定されます。

[コメントを追加する]

私はcpでこれを行う方法を知りません、少なくともmanページにはあなたのためにそれをするオプションは表示されません。コマンドfindを使用してコピーするファイル/ディレクトリのリストを見つけてcpに渡すことで、より複雑なソリューションを実行できますが、rsyncよりもはるかに複雑になります。rsyncは多くのLinuxでかなり標準的です


これは簡単にできないと言っていますcpか?私はむしろ、それが何をしているのかをすぐに理解することがより明確なので、それを使用しますが、もちろんそれがそのように使用できない場合、他のオプションを探すことができます。
eis

0

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にある場合にも当てはまります。

https://linux.die.net/man/1/find

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.