Linuxシェルで強制コピーができない場合の対処法 Linux Tips


さて、実は恥ずかしいことに、つい半月ぐらい前に知ったこと

(環境はCentOS 5.5)

一括でファイルを消したいときは、わざわざ質問のプロンプトが出るのはうるさいので’-f’オプションでプロンプト消しますよね

rm -rf ex

みたいな感じで。ヘルプの説明では

-f, –force           ignore nonexistent files, never prompt

と、プロンプト表示しないですね。(当然ですね)

他にも一括でファイルを移動させたい時もありますね。

mvコマンドもプロンプトを消すのは’-f’オプションですね。ヘルプでは

-f, –force                  do not prompt before overwriting

上書き時にプロンプトを表示しない。同じですね。

ではコピーは・・・・?実は‘-f’オプションをつけてもプロンプトは表示されます。

なんでやねん!と思いますよね

ヘルプを見ると

-f, –force                  if an existing destination file cannot be
opened, remove it and try again

・・・・・?!

コピー先にファイルがあり、それが開けない場合、それを消して再度コピー・・・・

もう少し詳しくmanコマンドで

ファイルをそれ自身にコピーしようとした場合、 (エラーメッセージを出す以外は) 何もしない。既存のファイルにコピーする場合、コピー先のフ ァ イ ル は
‘open(path,  O_WRONLY | O_TRUNC)’ で開かれる。新規ファイルにコピーする場合、新規ファイルは ‘open(path, O_WRONLY | O_CREAT, mode)’ で作成される。
コピー先のファイルが存在し、かつ -f オプションが与えられている場合にこの形式でのファイルのオープンに失敗すると、 cp は既存のファイルの削除 (もし
くはアンリンク) を試みる。そして、削除に成功した場合は新規ファイルへのコピーとして命令を続行する。

つまり、あくまで上書き先のファイルが開けない場合の対策で、rmコマンドの様に、上書きに対する対策ではない。

そして、プロンプトは関係ない。

つまり、これつけても、rmとかと同じようにプロンプトなしにならない。

そして、ヘルプを見ると’-i’オプションの説明が

-i, –interactive            prompt before overwrite

となっている。プロンプトを表示するオプションですね。これはrmにもmvにもあります。

で、cpには’-i’の他にプロンプト関連のオプションはない・・・

つまり、オンにできるけどオフに出来ない、でもデフォルトはオン
策なし
な訳ないじゃないですか
ディストリビューションの罠です

alias

を実行すると・・・・

alias cp=’cp -i’

こんな行があります。

実はcp自体はデフォルトではプロンプト表示しないのに、ディストリビューションが勝手にエイリアスはってるのですね。

消しちゃってもいいのですが、事故防止的にも消したくないですね。

実は、aliasを一時的に無効にできます

方法はとても簡単

コマンドの頭に ‘\’ を付けるだけ

\cp -r ./* (略)

という感じ。

ウェブアプリのアップデートとかにもなかなか便利ですよ。

とっても簡単なLinux Tipsでした

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください