web-dev-qa-db-ja.com

ソースファイルが存在しない場合に「cp」コマンドでエラーが発生しないようにするにはどうすればよいですか?

Mac OS Xを使用しています。このようなビルドスクリプトのcpコマンドでいくつかのファイルをコピーしようとしています。

cp ./src/*/*.h ./aaa

ただし、。/ srcディレクトリに.hファイルがない場合、このコマンドはエラーを発生させます。コマンドでエラーが発生しないようにするにはどうすればよいですか? (サイレントエラー)このエラーによりビルド結果が失敗しますが、ヘッダーファイルがいくつかある場合にのみコピーしたいです。

64
Eonil

エラーメッセージについて話している場合、それをビットバケットに送信することで抑制できます。

cp ./src/*/*.h ./aaa 2>/dev/null

終了コードとエラーメッセージを抑制したい場合:

cp ./src/*/*.h ./aaa 2>/dev/null || :

あなたはの線に沿って何かを探しています

if [ -e file ]
 then cp file /somewhere
fi

(残念ながら、-fオプションは、探しているドロイドではありません。)

グロブと一致させたい場合は、機能しません。代わりにfindを使用してください。例:

find ./src -name \*.h -exec cp {} ./destination \;
14
Brad Ackerman

古い質問ですが、それでも他の人には関係があるかもしれません。
needを使用せずにcpを使用する場合は、rsyncで試すことができます。
すべてのファイルをソースから宛先ディレクトリにコピーするには、次を実行:

rsync -avzh --ignore-errors /path/to/source /path/to/destination

Rsyncには、Linux、Mac OS X、FreeBSDなど、ほとんどのUnixライクなシステムが付属しています。

9
mre

結果をtrueにパイプすると、コマンドが常に成功することが保証されます。私はこれをLinuxで試しましたが、どのMac OSでも試していません。

cp ./src/*/*.h ./aaa | true
7
Vivek

正しいエラーステータスを強制できます。関数付き:

$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }

次の場合:

$ ls foo bar baz
ls: baz: No such file or directory
bar foo

通常のコピーはエラーを返します。終了ステータス1を返します。

$ cp baz bar ; echo $?
cp: baz: No such file or directory
1

上記のcpalways()関数を使用すると、エラーは非表示になります。

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0
2