나는 이 명령의 모든 부분을 알고 있습니다.
sudo mv home/* *
sudo
: 슈퍼 유저는 루트 권한으로 실행합니다.mv
: 파일이나 디렉터리를 이동합니다.home/*
: mv 명령의 매개변수입니다. 홈 디렉토리의 내용을 나타냅니다. 별표는*
현재 디렉터리에서 사전순으로 정렬된 파일 목록으로 확장되는 와일드카드 문자입니다.
다음 매개변수는 운명 폴더입니다. 그러나 대상 디렉터리로 별표를 지정하고 명령을 실행하면 폴더가 완전히 사라집니다. 그렇다면 *
이 경우는 무엇입니까?
답변1
home/*
쉘 전역 변수 이며 *
먼저 쉘에 의해 확장됩니다(따라서 여기에서는 수퍼유저 권한이 아닌 사용자 자신으로 실행). 결과는 다음과 같습니다.그 다음에명령에 대한 인수로 전달됩니다.
따라서 , , , 가 포함 home
되어 있고 현재 디렉터리에 , , , , 가 포함되어 있으면 수신되는 매개변수 는 , , , , 입니다 ..
..
.hidden
u1
u2
.
..
.hidden
-i
x
y
mv
mv
home/u1
home/u2
-i
x
y
mv
GNU와 같은 일부 구현에는 mv
인수가 feature로 -
시작하는 버그 기능 이 있습니다 .-i
-i
mv
sudo
y
대상 디렉터리로 처리되며 디렉터리 유형(또는 디렉터리에 대한 심볼릭 링크)인 경우 mv
해당 파일은 해당 디렉터리에서 사라집니다.y
mv
*
or 인수는 표시되지 않습니다 home/*
(물론 실제로 그런 이름의 파일이 있는 경우는 제외). 그러나 일부 쉘(예: 대부분의 Bourne 유사 쉘)에는 glob이 어떤 파일과도 일치하지 않으면 변경되지 않은(확장되지 않은) 명령으로 전달되는 결함이 있습니다.
따라서 현재 디렉터리에 숨겨진 파일만 포함되어 있으면 이것이 mv
마지막 인수로 수신됩니다. 특별한 처리가 수행되지 않으므로(셸의 역할은 glob을 이해하는 것임) 대상 디렉터리의 리터럴 이름으로 처리됩니다. 이제 숨겨지지 않은 파일이 없으면 디렉터리는 존재하지 않게 되므로 존재하지 않는 대상 디렉터리에 대한 오류만 보고됩니다. in만 있는 경우 현재 디렉터리로 이름이 변경됩니다.*
mv
*
*
mv home/u1 home/u2 *
u1
home
mv home/u1 *
mv
home/u1
*
이 버그 기능은 1979년 Bourne 쉘에 의해 도입되었습니다. 이전 버전의 Unix에서는 (및 변경하지 않은 csh에서도) glob 일치가 없으면 명령이 취소됩니다. 그런 다음 glob은 /etc/glob
도우미에 의해 확장됩니다(따라서 glob이라는 이름이 붙음). 하나 이상의 glob이 파일과 일치하면 일치하지 않는 glob이 제거됩니다. 따라서 csh/tcsh (또는 zsh -o cshnullglob
) 에서 mv home/* *
숨겨지지 않은 파일이 없는 현재 디렉터리 는 .mv home/u1 home/u2
u1
u2
zsh
or fish
(또는 ) 과 같은 최신 쉘에서는 bash -o failglob
glob이 일치하지 않으면 명령을 취소하여 이 문제를 해결했습니다.
답변2
이는 모두 쉘의 와일드카드 패턴이 확장되는 대상에 따라 다릅니다.
다음 세 가지 작업 중 하나를 수행합니다.
*
명령 끝의 확장이 이름 목록이고 목록의 마지막 항목이 이름인 경우목차, 명령은home/*
확장된 모든 항목과*
확장된 모든 항목(마지막 디렉터리 이름 제외)을 해당 디렉터리로 이동합니다. 다른 것으로 확장되고 대상 디렉터리에 아직 디렉터리가 포함되어 있지 않은 경우home/*
대상 디렉터리의 디렉터리와 함께 일치하는 파일 및 디렉터리가 검색됩니다.home
home/*
home
*
명령 끝의 확장이 이름 목록이고 목록의 마지막 항목이 이름인 경우아니요디렉터리에 있으면 명령에서 오류가 발생합니다.*
전혀 확장되지 않으면(현재 디렉터리가 비어 있기 때문에) 오류가 발생합니다 .
GNU coreutils를 사용 mv
하고 마지막 *
이름이 대시로 시작하는 하나 이상의 이름과 일치하는 경우 mv
옵션이 이름을 해석하는 방식에 따라 명령의 기능이 변경될 수 있습니다.
답변3
이 프로그램을 직접 실행하면 대상 폴더에 라는 폴더가 생성되고 해당 프로그램 *
에서 가져온 소스 파일도 삭제됩니다. 몇 가지 테스트 후에 *
"디렉토리가 아닙니다"라는 예상 동작이 반환되고 *
이름이 지정된 새 디렉터리가 생성되지 않습니다.
echo *
나는 이것이 그의 파일이 사라졌다가 다시 왔다고 말하면서 묻는 질문과 더 일치한다고 믿습니다 *
.