存在しないファイルをcpとして処理しようとすると、スクリプトでエラーが発生しないようにしたいと思います。しかし、権限の欠如などの他のエラーについては、エラーメッセージを印刷したいと思います。これはdev / nullにメッセージを送信できないことを意味します。スクリプトでこれを実行できる他のソリューションは何ですか?
1つのオプションは、コピー前にファイルが存在することを確認するためにifステートメントを使用することですが、このアプローチはやや混乱しているようです。ファイル名に*を追加すると、欲しいものが得られると思います。奇妙な方法のように見えますが。私が望むものを得ることができるコマンドライン引数や他の方法はありますか?
答え1
あなたは次のようになります:
{ command <doesntexist cp doesntexist 2>&3 ; } 3>&2 2>/dev/null
サブシェルでは短くすることができます...
( <file cp file ... 2>&3 ) 3>&2 2>/dev/null
しかし、まだ遠いようです...
[ -r file ] && cp file ...
これらのファイルはすべて読み取り可能なテストファイルです。ディレクトリでは機能しません。
しかし...
[ -e file ] && cp file ...
...できます...
答え2
存在することを確認すると問題が減りますが、最も一般的な場合は競合状態です。確認とコピー試行の間でもファイルを削除できます。
たぶん、すべてのエラーをキャッチし、「ファイルが存在しません」エラーを削除することもできます。
一般コピー:
$ cp noexist bar /tmp
cp: cannot stat `noexist': No such file or directory
cp: cannot open `bar' for reading: Permission denied
修正済み
$ cp noexist bar /tmp 2>&1 | grep -v "No such file or directory" >&2
cp: cannot open `bar' for reading: Permission denied
答え3
ただ確認してくださいもしディレクトリ/ファイルが既に存在します。
コピーする文書
file=path/to/the/file/to/copy && [ -f "${file}" ] && cp ${file} destination/path/here
コピーする目次
dir=path/to/the/dir/to/copy && [ -d "${dir}" ] && cp -r ${dir} destination/path/here
メモ:
スペース前後角かっこは必須であり、上記のコマンドに違反しません。