バックアップしたかったのに~/.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
パターンが 。*.old
known_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_rsa
id_rsa.old
*
mv
- ワイルドカードパターンに一致するファイルはありません。ほとんどのシェルでは、ワイルドカードパターンが拡張されていないままであるため、
mv
引数id_rsa
と*.old
。次に、名前付きファイルid_rsa
に移動します*.old
(アスタリスクはファイル名の最初の文字です)。この場合、一部のシェル(構成に応じて)はエラーを表示し、コマンドを実行しません。 - ワイルドカードパターンは、ディレクトリではなくファイルの1つと正確に一致します。この場合、シェルはパターンを一致するファイルの名前に置き換えます。したがって、一致するファイルに
mv
移動すると、古いファイルが上書きされます。id_rsa
あなたの場合は、次のことが起こります。引数とオーバーライドのためにmv
呼び出されます。id_rsa
known_hosts.old
known_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_rsa
(id_rsa
空の文字列に関連付けられている)とid_rsa.old
(id_rsa
に関連付けられている.old
)に拡張します。
パターンに基づいてファイル名を一括変更するには、最も一般的に使用されるツールは次のとおりです。zmv
(zsh のみ),prename
そしてmmv
。形式のすべてのファイル名を次のように変更するには、次のものを使用できます。id_SOMETHING
id_SOMETHING.old
zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*