유닉스 : 디렉토리 이름 뒤의 슬래시


13

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

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

아니면 차이가 없습니까? 아니면 사용중인 명령에 따라 달라 집니까? 예를 들어, 사용하는 버전에 따라 rsync 동작이 약간 변경된다는 것을 읽었습니다. 누구든지 좋은 설명을 가지고 있으므로 더 이상 추측하지 않아도 내가 무엇을하고 있는지 알 것 같은 느낌이 들지 않습니까?


2
rsync도 마찬가지입니다. 후행 슬래시를 건너 뛰거나 추가하는지에 따라 디렉토리 자체 또는 그 아래의 항목으로 복사를 시작합니다.
maxelost

@ maxelost : 몇 가지 예를 들어 대답을 추가 할 수 있습니까?
Svish

미켈은 아래에 꽤 명확하게 대답했다고 생각합니다.
maxelost 2019

답변:


17

많은 유닉스 유틸리티는 슬래시가 있는지에 따라 심볼릭 링크를 다르게 취급합니다.

이 동작은 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복사 dirdir.bak만드는 dir내부dir.bak
  • rsync dir/ dir.bak내부 dir를 만들지 않고 의 모든 내용을 복사합니다.dirdir.bak

2

jsalonen 이미 말했듯이,이 명령은 참으로 경우 동일한 결과를 가지고 foobar사실, 디렉토리의 문제로입니다.

그러나, 경우 foobar디렉토리하지 않습니다 당신이 후행 슬래시를 추가하는 경우, 다음 명령이 실패하고 그렇게하지 않으면 성공합니다. 명령이 성공하면 의도 한 결과를 얻지 못할 수 있습니다. 사실, 당신도 잃게 데이터의 경우 수 foo하고 bar있는 파일 ( bar덮어 쓰기 될 것이다).

당신의 의도는 디렉토리와하지에게 파일을 지정하는 경우, 당신은 해야 그 명령이 더 강력하게 때문에, 후행 슬래시를 사용하는 기대하는 경우 foo또는 bar디렉토리가 실패, 다음 명령 대신 예기치 않은 결과가 필요없이 정상적으로 실패합니다.

또한 일부 (희귀 한) 명령은 디렉토리가 있더라도 슬래시의 존재 여부에 따라 다르게 작동합니다 (예 :) rsync.


예, 명령이 암시 적으로 슬래시를 처리하거나 처리하지 않을 수 있습니다. rsync를 예제로 제공 한 것이 매우 좋습니다!
jsalonen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.