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.

그 안에 파일 이름을 지정했으므로 glob known_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이동 하고 첫 번째 인수로 대체될 것이라고 생각한 것처럼 보이지만 그렇지 않습니다. 와일드카드는 명령이 아닌 셸에 의해 확장됩니다. 이 명령이 표시 되면 쉘은 이미 와일드카드 문자를 확장한 것입니다. 네 가지 상황이 있습니다.id_rsaid_rsa.old*mv

  • 와일드카드 패턴과 일치하는 파일이 없습니다. 대부분의 셸에서는 와일드카드 패턴이 확장되지 않은 상태로 유지되므로 mv인수 id_rsa*.old. 그런 다음 이름이 지정된 파일 id_rsa로 이동합니다 *.old(별표는 파일 이름의 첫 번째 문자입니다). 이 경우 일부 쉘(구성에 따라)은 오류를 표시하고 명령을 실행하지 않습니다.
  • 와일드카드 패턴은 디렉터리가 아닌 파일 하나와 정확히 일치합니다. 이 경우 쉘은 패턴을 일치하는 파일의 이름으로 바꿉니다. 따라서 일치하는 파일로 mv이동하면 이전 파일을 덮어씁니다. id_rsa귀하의 경우에는 다음과 같은 일이 발생합니다. 인수 및 재정의를 위해 mv호출됩니다 .id_rsaknown_hosts.oldknown_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_SOMETHINGid_SOMETHING.old

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

관련 정보