다음 명령의 차이점은 무엇입니까?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
아니면 차이가 없나요? 아니면 사용되는 명령에 따라 달라지나요? 예를 들어, 사용하는 버전에 따라 rsync 동작이 약간 변경된다는 내용을 읽었습니다. 더 이상 추측할 필요가 없고 내가 무엇을 하고 있는지 알고 있는 것처럼 느낄 수 있도록 좋은 설명을 제공하는 사람이 있나요?
답변1
많은 Unix 유틸리티는 뒤에 슬래시가 있는지 여부에 따라 심볼릭 링크를 다르게 처리합니다.
이 동작은POSIX 심볼릭 링크 문서그리고 에서도 언급된다.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
or -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
답변2
jsalonen이 이미 말했듯이 이러한 명령은 실제로 디렉터리인 경우 foo
동일한 결과를 갖습니다.bar
그러나 foo
및 bar
가 디렉터리가 아닌 경우 뒤에 슬래시를 추가하면 명령이 실패하고 그렇지 않으면 성공합니다. 문제는 명령이 성공하면 의도한 결과를 얻지 못할 수도 있다는 것입니다. 실제로 파일인 경우( foo
덮어 쓰여짐) 데이터가 손실될 수도 있습니다.bar
bar
파일이 아닌 디렉터리를 지정하려는 경우~해야 한다foo
후행 슬래시를 사용하면 명령이 더욱 강력해집니다. 또는 디렉터리 에 대한 기대가 bar
실패하면 명령은 예상치 못한 결과가 발생하는 대신 정상적으로 실패합니다.
또한 일부(드물게) 명령은 디렉토리에서도 후행 슬래시 유무에 따라 다르게 작동합니다(예: rsync
).