다음 명령의 차이점은 무엇입니까?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
아니면 차이가 없습니까? 아니면 사용중인 명령에 따라 달라 집니까? 예를 들어, 사용하는 버전에 따라 rsync 동작이 약간 변경된다는 것을 읽었습니다. 누구든지 좋은 설명을 가지고 있으므로 더 이상 추측하지 않아도 내가 무엇을하고 있는지 알 것 같은 느낌이 들지 않습니까?
다음 명령의 차이점은 무엇입니까?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
아니면 차이가 없습니까? 아니면 사용중인 명령에 따라 달라 집니까? 예를 들어, 사용하는 버전에 따라 rsync 동작이 약간 변경된다는 것을 읽었습니다. 누구든지 좋은 설명을 가지고 있으므로 더 이상 추측하지 않아도 내가 무엇을하고 있는지 알 것 같은 느낌이 들지 않습니까?
답변:
많은 유닉스 유틸리티는 슬래시가 있는지에 따라 심볼릭 링크를 다르게 취급합니다.
이 동작은 POSIX Symbolic Link 문서에 설명 되어 있으며 GNU coreutils 문서 에도 언급되어 있습니다 .
기본적으로 후행 슬래시는 심볼릭 링크를 따르는 (또는 "역 참조") 것을 의미합니다.
예를 들어 아래 코드 dirlink
에서 심볼릭 링크를 dirlink/
의미 하지만 심볼릭 링크가 가리키는 디렉토리를 의미합니다. rm
이라고 말하지 않으면 디렉토리를 제거하지 rm -r
않지만 rm
옵션이 없으면 심볼릭 링크를 행복하게 제거합니다.
$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
또한 디렉토리가 실제 디렉토리인지 또는 디렉토리에 대한 심볼릭 링크인지 여부를 신경 쓰지 않고 디렉토리의 권한을 보는 데 유용합니다.
$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/
그리고 여전히 일반 디렉토리에서 작동합니다.
$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/
다른 예는 find
명령입니다. 경우 path
당신이 검색하도록 요청은 심볼릭 링크이며, 그것은 단지 심볼릭 링크를 처리하는 의미 기본적으로 심볼릭 링크를 따르지 않습니다. 후행 슬래시를 추가하면 심볼릭 링크를 링크가 가리키는 디렉토리로 취급합니다.
$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
(일부 버전의 find에는 -follow
또는 -L
옵션이 있지만 첫 번째 심볼뿐만 아니라 모든 심볼릭 링크를 따릅니다)
의 경우 rsync
슬래시를 추가해야하는지 여부는 복사하려는 디렉토리를 하위 디렉토리로할지 여부에 따라 다릅니다.
$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file
다시 말해:
rsync dir dir.bak
복사 dir
로 dir.bak
만드는 dir
내부dir.bak
rsync dir/ dir.bak
내부 dir
를 만들지 않고 의 모든 내용을 복사합니다.dir
dir.bak
jsalonen 이미 말했듯이,이 명령은 참으로 경우 동일한 결과를 가지고 foo
와 bar
사실, 디렉토리의 문제로입니다.
그러나, 경우 foo
및 bar
디렉토리하지 않습니다 당신이 후행 슬래시를 추가하는 경우, 다음 명령이 실패하고 그렇게하지 않으면 성공합니다. 명령이 성공하면 의도 한 결과를 얻지 못할 수 있습니다. 사실, 당신도 잃게 데이터의 경우 수 foo
하고 bar
있는 파일 ( bar
덮어 쓰기 될 것이다).
당신의 의도는 디렉토리와하지에게 파일을 지정하는 경우, 당신은 해야 그 명령이 더 강력하게 때문에, 후행 슬래시를 사용하는 기대하는 경우 foo
또는 bar
디렉토리가 실패, 다음 명령 대신 예기치 않은 결과가 필요없이 정상적으로 실패합니다.
또한 일부 (희귀 한) 명령은 디렉토리가 있더라도 슬래시의 존재 여부에 따라 다르게 작동합니다 (예 :) rsync
.