~/.ssh/id_rsa
をid_rsa.old
にバックアップしたかったのですが、削除されたようです。これはどのように可能ですか? :)
root@localhost:~/.ssh# ls -l
total 16
-rw------- 1 root root 3326 Mar 12 11:22 id_rsa
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw-r--r-- 1 userx userx 666 Feb 29 10:53 known_hosts.old
root@localhost:~/.ssh# mv id_rsa *.old
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
root@localhost:~/.ssh# touch p
root@localhost:~/.ssh# mv p *.p
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
-rw-r--r-- 1 root root 0 Mar 12 11:28 *.p
root@localhost:~/.ssh# rm *.p
root@localhost:~/.ssh# ls -l
total 12
-rw-r--r-- 1 root root 756 Mar 12 11:22 id_rsa.pub
-rw------- 1 userx userx 666 Mar 8 11:09 known_hosts
-rw------- 1 root root 3326 Mar 12 11:22 known_hosts.old
userx@localhost:~$ uname -r
4.2.0-30-generic
userx@localhost:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 15.10
Release: 15.10
Codename: wily
userx@localhost:~$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
名前がknown_hosts.old
に変更されたため、以前のknown_hosts.old
の内容が上書きされました。
そこにはすでにknown_hosts.old
という名前のファイルがあるので、グロブパターン*.old
はknown_hosts.old
に展開されています。
一言で言えば、次のとおりです。
mv id_rsa *.old
に拡張されました:
mv id_rsa known_hosts.old
bash
に、known_hosts.old
という名前のファイルが存在しない場合、リテラル*.old
に展開されます(nullglob
を有効にしていない場合)。
mv id_rsa *.old
がid_rsa
をid_rsa.old
に移動し、*
が最初の引数に置き換えられると思ったようですが、そうではありません。ワイルドカードは、コマンドではなくシェルによって展開されます。 mv
がコマンドを確認するまでに、シェルはワイルドカードを展開しています。 4つのケースがあります:
id_rsa
および*.old
を指定してmv
が呼び出されます。次に、id_rsa
を*.old
というファイルに移動します(アスタリスクはファイル名の最初の文字です)。一部のシェル(構成によって異なります)は、代わりにエラーを表示し、その場合はコマンドを実行しません。mv
はid_rsa
をその一致するファイルに移動し、前のファイルを上書きします。これがあなたのケースで起こったことです:mv
が引数id_rsa
とknown_hosts.old
で呼び出され、known_hosts.old
が上書きされました。mv
は文句を言います。mv
はそれらをソースファイルと見なすため、これは最後のファイルを除くパターンに一致するすべてのファイルにも適用されます。mv
が予期せずターゲットファイルを上書きしないようにするには、確認を求めるプロンプトを表示します。これをシェルの初期化に入れます(例:.bashrc
):
alias cp='cp -i'
alias mv='mv -i'
既存の名前に基づいてファイルの名前を変更するには、mv
だけでは役に立ちません。別のツールを使用するか、mv
に完全な宛先名を指定するように手配する必要があります。実行しようとしていたことを実行する1つの方法は、 中括弧の展開 を使用することです。これにより、共通の語幹を持つ単語を指定できます。
mv id_rsa{,.old}
シェルはこれを引数id_rsa
(空の文字列と連結されたid_rsa
)およびid_rsa.old
(id_rsa
と連結された.old
)を使用してmv
に展開します。 )。
パターンに従ってファイルの名前を一括変更するために最も一般的に役立つツールは、 zmv
(zshのみ)、 prename
および mmv
。フォームのすべてのファイルの名前をid_SOMETHING
からid_SOMETHING.old
に変更するには、次を使用できます。
zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*