mvがmv id_rsa *.oldファイルを削除したのはなぜですか? [コピー]

mvがmv id_rsa *.oldファイルを削除したのはなぜですか? [コピー]

バックアップしたかったのに~/.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)

答え1

名前が変更され、以前のknown_hosts.old内容が上書きされますknown_hosts.old

その中にファイル名を指定したので globknown_hosts.oldパターンが 。*.oldknown_hosts.old

簡単に言えば、

mv id_rsa *.old

次に拡張されました。

mv id_rsa known_hosts.old

そこにbash名前の付いたファイルがない場合は、known_hosts.oldテキストに展開されます*.old(まだアクティブになっていないと仮定nullglob)。

答え2

mv id_rsa *.old移動して最初の引数に置き換えられると思ったようですが、そうではありません。ワイルドカードはコマンドではなくシェルによって拡張されます。このコマンドが表示されると、シェルはすでにワイルドカード文字を拡張しています。 4つの状況があります。id_rsaid_rsa.old*mv

  • ワイルドカードパターンに一致するファイルはありません。ほとんどのシェルでは、ワイルドカードパターンが拡張されていないままであるため、mv引数id_rsa*.old。次に、名前付きファイルid_rsaに移動します*.old(アスタリスクはファイル名の最初の文字です)。この場合、一部のシェル(構成に応じて)はエラーを表示し、コマンドを実行しません。
  • ワイルドカードパターンは、ディレクトリではなくファイルの1つと正確に一致します。この場合、シェルはパターンを一致するファイルの名前に置き換えます。したがって、一致するファイルにmv移動すると、古いファイルが上書きされます。id_rsaあなたの場合は、次のことが起こります。引数とオーバーライドのためにmv呼び出されます。id_rsaknown_hosts.oldknown_hosts.old
  • ワイルドカードパターンは2つ以上のファイルと一致し、そのうち最後のファイル(辞書順)はディレクトリではありません。この場合、mv文句は最後のファイルを除いてすべてソースファイルであるため、複数のファイルを同じファイルに移動することは意味がありません。
  • ワイルドカードパターンは1つ以上のファイルと一致し、最後の一致(辞書順)はディレクトリです。ソースファイルがこのディレクトリに移動されます。同じ名前のファイルがすでに存在する場合は上書きされます。パターンに一致する項目が複数ある場合、これはパターンに一致する最後のファイルを除くすべてのファイルにも適用されます。これはmvソースファイルと見なされるためです。

誤ってターゲットファイルを上書きしないようにするには、mv確認メッセージを表示してください。これをシェル初期化に入れます(例.bashrc:)。

alias cp='cp -i'
alias mv='mv -i'

既存の名前に基づいてファイルの名前を変更するだけでmvは役に立ちません。別のツールを使用するか、完全なターゲット名mvを提供するように準備する必要があります。あなたがやろうとしていることを行う1つの方法は、次を使用することです。支柱の拡張,共通語幹を持つ単語を指定できます。

mv id_rsa{,.old}

シェルはこれをmv引数id_rsaid_rsa空の文字列に関連付けられている)とid_rsa.oldid_rsaに関連付けられている.old)に拡張します。

パターンに基づいてファイル名を一括変更するには、最も一般的に使用されるツールは次のとおりです。zmv(zsh のみ),prenameそしてmmv。形式のすべてのファイル名を次のように変更するには、次のものを使用できます。id_SOMETHINGid_SOMETHING.old

zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*

関連情報