助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14476
問題を開く
cpコマンドを使用してファイルをコピーする際、コピー先に既存のファイルがあり上書きできない場合は、そのファイルを削除してからコピーしたい。適切なcpコマンドのオプションは次のうちどれか。

正解

-f

解説

cpコマンドの書式と主なオプションは以下のとおりです。

cp [オプション] コピー元のファイル(ディレクトリ) コピー先ファイル(ディレクトリ)


上表より正解は「-f」です。

cpコマンドはデフォルトでファイルを上書きしますが、権限などの理由で書き込み先のファイルが書き込みオープンできない場合、「-f」オプションはそのファイルを削除してからコピーします。

以下は実行例です。


その他の選択肢については上表をご確認ください。
上に戻る

cpのオプション(-f)

投稿日 2025/01/10

cpのオプションの表で
-fはコピー先の既存のファイルやディレクトリが上書きできない場合、削除してからコピーする
とありますが、
-fは確認も行わず、強制的に上書きする
とありました。

実際例でも
削除された形跡は一切なく上書きされているように見られます。

ですのでcpのオプションの表の-fの表記を修正してください。

2025/01/10 20:50

man をみてみたのですが表の通りの記載ですね。

$ man cp
<略>
-f, --force
if an existing destination file cannot be opened, remove it and try again (this
option is ignored when the -n option is also used)

ソースコード追うのはちょっと面倒だったのでシステムコールを追って確認しましたが、unlink() (ファイルを削除する Linux カーネルの機能。 https://manpages.ubuntu.com/manpages/focal/ja/man2/unlink.2.html をご参照ください)が呼ばれてることが確認できたので、ちゃんと man やオプションの表の通りですね。

$ id > src
$ date > dst
$ chmod 400 dst
$ ls -l
total 8
-r--------. 1 user user  29 Jan 10 20:45 dst
-rw-rw-r--. 1 user user 129 Jan 10 20:44 src
$ cp src dst
cp: cannot create regular file ‘dst’: Permission denied
$ strace cp -f src dst 2>&1 | grep unlink
unlink("dst") ←ここ

ちなみに

-fは確認も行わず、強制的に上書きする
とありました。

これはどこにあった記載でしょうか?


コメント

y ya-su

2025/01/17 10:10

ご回答ありがとうございます。 この解説を見れば分かりますが もともとの解説で「~~上書きできない場合、削除してからコピーする」とありますが、 これは『上書きできない場合→削除をする→削除されたことを確認する→コピーする→コピーされたことを確認』となりませんか? 参考サイトのようにすればわかりやすいと思うのですが…… 「コピー先が存在する場合、確認を求めずに削除する。」 「コピー先に同名ファイルがあるときも警告せず,上書きを行う」 また、「-fは確認も行わず、強制的に上書きするとありました。」ですが 本問題の参考サイトを見て自分なりに咀嚼した表現になってしまいました。 すみません。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?