백업하고 싶었는데 ~/.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
.
그 안에 파일 이름을 지정했으므로 glob known_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
이동 하고 첫 번째 인수로 대체될 것이라고 생각한 것처럼 보이지만 그렇지 않습니다. 와일드카드는 명령이 아닌 셸에 의해 확장됩니다. 이 명령이 표시 되면 쉘은 이미 와일드카드 문자를 확장한 것입니다. 네 가지 상황이 있습니다.id_rsa
id_rsa.old
*
mv
- 와일드카드 패턴과 일치하는 파일이 없습니다. 대부분의 셸에서는 와일드카드 패턴이 확장되지 않은 상태로 유지되므로
mv
인수id_rsa
및*.old
. 그런 다음 이름이 지정된 파일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
전체 대상 이름을 제공하도록 준비해야 합니다. 당신이하려는 일을 수행하는 한 가지 방법은 다음을 사용하는 것입니다.버팀대 확장, 공통 어간을 갖는 단어를 지정할 수 있습니다.
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_*