さて、実は恥ずかしいことに、つい半月ぐらい前に知ったこと
(環境は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でした