Unix: 디렉터리 이름 뒤에 슬래시를 붙일지 여부

Unix: 디렉터리 이름 뒤에 슬래시를 붙일지 여부

다음 명령의 차이점은 무엇입니까?

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 버전에는 -followor -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.bakdir에 복사 dir.bak, dir내부 만들기dir.bak
  • rsync dir/ dir.bak내부를 dir만들지 않고 의 모든 내용을 복사합니다 .dirdir.bak

답변2

jsalonen이 이미 말했듯이 이러한 명령은 실제로 디렉터리인 경우 foo동일한 결과를 갖습니다.bar

그러나 foobar가 디렉터리가 아닌 경우 뒤에 슬래시를 추가하면 명령이 실패하고 그렇지 않으면 성공합니다. 문제는 명령이 성공하면 의도한 결과를 얻지 못할 수도 있다는 것입니다. 실제로 파일인 경우( foo덮어 쓰여짐) 데이터가 손실될 수도 있습니다.barbar

파일이 아닌 디렉터리를 지정하려는 경우~해야 한다foo후행 슬래시를 사용하면 명령이 더욱 강력해집니다. 또는 디렉터리 에 대한 기대가 bar실패하면 명령은 예상치 못한 결과가 발생하는 대신 정상적으로 실패합니다.

또한 일부(드물게) 명령은 디렉토리에서도 후행 슬래시 유무에 따라 다르게 작동합니다(예: rsync).

관련 정보