Linux のコマンドラインで cp といえば「ファイルコピー」コマンドです。
とやれば「a.txt というファイルを b.txt という名前でコピー」です。簡単ですよね。
この cp コマンドには便利なオプションが数多くあります。例えば、
で /home/a というディレクトリをまるごと /tmp に(/tmp/a というディレクトリを作って)コピーする、という命令になる、とかです。
この cp コマンドは賢いので、コピー先に同じ名前のファイルがあると、新しいファイルで上書きするかどうかを確認してくれます:
ここで y(es) を押すと上書きコピー、n(o) を押すと上書きしません。
さて、 ディレクトリまるごとコピーした後に、コピー元のディレクトリの一部に変更が加わったとします。ファイルそのものが更新されたとか、新しいファイルが追加されたとか。 で、その変更をコピー先にも反映させようとして、もう一度ディレクトリまるごとコピーを試みるとこんな感じになります:
新しく追加されたファイルは無条件にコピーされるのですが、それ以外の(既に存在する)ファイルは上書き扱いになるので、1つ1つ確認メッセージが表示されます。で、上記例では最初の a.txt は上書きする、次の b.txt は上書きしない、次の c.txt は上書きする、・・・といちいちコマンドを入力してコピーするかどうかを指示しています。
現実的には変更の加わったファイルは上書きしてほしいし、変更されていないファイルについても(処理としては無駄になりますが)上書きしても結果的にファイル内容は変わらないので、「全て無条件に上書きしても構わない」というケースも少なくないと思います。でもその場合でも y とリターンキーを連打することになって、ちょっと面倒です。
もちろんそんなことは想定済みで、cp コマンドには「コピー先に同名のファイルがあった場合に強制上書きする」というオプション -f があります。
cp は知らないうちに 'cp -i' という命令になっていました。この -i オプションは強制インタラクティブの指定で、いわば -f の逆の動作(常に上書きを確認する)を指定するオプションです。
なので、このエイリアスを無効にすれば -f オプションが有効になるのですが、デフォルトの設定を変えてしまうのはそれはそれで怖い。。
というわけで、普段は -f を付ける時だけ cp コマンドの頭に \(¥あるいはバックスラッシュ) を付けて実行するようにしています。コマンドの頭に \ を付けると、その時だけエイリアスが無効になります。
もちろん -r オプションなどとも一緒に使えるので、これでディレクトリまるごと上書きコピーすることもできるようになります。
# cp a.txt b.txt
とやれば「a.txt というファイルを b.txt という名前でコピー」です。簡単ですよね。
この cp コマンドには便利なオプションが数多くあります。例えば、
# cp -r /home/a /tmp
で /home/a というディレクトリをまるごと /tmp に(/tmp/a というディレクトリを作って)コピーする、という命令になる、とかです。
この cp コマンドは賢いので、コピー先に同じ名前のファイルがあると、新しいファイルで上書きするかどうかを確認してくれます:
# cp a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?
ここで y(es) を押すと上書きコピー、n(o) を押すと上書きしません。
さて、 ディレクトリまるごとコピーした後に、コピー元のディレクトリの一部に変更が加わったとします。ファイルそのものが更新されたとか、新しいファイルが追加されたとか。 で、その変更をコピー先にも反映させようとして、もう一度ディレクトリまるごとコピーを試みるとこんな感じになります:
# cp -r /home/a /tmp
cp: `a.txt' を上書きしてもよろしいですか(yes/no)? y
cp: `b.txt' を上書きしてもよろしいですか(yes/no)? n
cp: `c.txt' を上書きしてもよろしいですか(yes/no)? y
:
新しく追加されたファイルは無条件にコピーされるのですが、それ以外の(既に存在する)ファイルは上書き扱いになるので、1つ1つ確認メッセージが表示されます。で、上記例では最初の a.txt は上書きする、次の b.txt は上書きしない、次の c.txt は上書きする、・・・といちいちコマンドを入力してコピーするかどうかを指示しています。
現実的には変更の加わったファイルは上書きしてほしいし、変更されていないファイルについても(処理としては無駄になりますが)上書きしても結果的にファイル内容は変わらないので、「全て無条件に上書きしても構わない」というケースも少なくないと思います。でもその場合でも y とリターンキーを連打することになって、ちょっと面倒です。
もちろんそんなことは想定済みで、cp コマンドには「コピー先に同名のファイルがあった場合に強制上書きする」というオプション -f があります。
でも実際にやってみるとうまくいかないケースが多いです。# cp --help
:
:
-f, --force if an existing destination file cannot be opened, remove it and try again.
:
# cp -f a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?
これはシステムの設定で cp にエイリアスが指定されていることが原因として考えられます。僕の CentOS 環境では特に何もエイリアスを指定したつもりがなくてもこのようなエイリアスが(デフォルトで)設定されているようでした。# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
:
cp は知らないうちに 'cp -i' という命令になっていました。この -i オプションは強制インタラクティブの指定で、いわば -f の逆の動作(常に上書きを確認する)を指定するオプションです。
# cp --help
:
:
-i, --interactive prompt before overwrite (overrides a previous -n option)
:
なので、このエイリアスを無効にすれば -f オプションが有効になるのですが、デフォルトの設定を変えてしまうのはそれはそれで怖い。。
というわけで、普段は -f を付ける時だけ cp コマンドの頭に \(¥あるいはバックスラッシュ) を付けて実行するようにしています。コマンドの頭に \ を付けると、その時だけエイリアスが無効になります。
# \cp -f a.txt b.txt # (上書きコピー完了)
もちろん -r オプションなどとも一緒に使えるので、これでディレクトリまるごと上書きコピーすることもできるようになります。
コメント
コメント一覧 (1)