디렉토리에 슬래시를 언제 사용해야 합니까? [복사]

디렉토리에 슬래시를 언제 사용해야 합니까? [복사]

중복 가능성:
Linux는 다중 경로 구분 기호(/home////username///file)를 어떻게 처리합니까?

/Linux에서 사용하는 대부분의 명령은 디렉터리 이름 끝에 후행 슬래시 문자를 포함하는지 여부에 관계없이 정확히 동일하게 작동합니다.

예를 들어:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

이 후행 슬래시는 언제 중요합니까? 후행 슬래시의 의미는 무엇입니까?

답변1

좋은 예는 파일을 디렉터리로 이동하는 것입니다.

mv some_file foo

그리고

mv some_file foo/

foo첫 번째는 존재하지 않으면 이름이 바뀌고 예상한 대로 some_file변경 되지 않습니다 . 두 번째는 정확히 원하는 대로 불평합니다.foofoo/some_file

foo첫 번째는 파일이 존재하지만 디렉토리가 아닌 경우 파일을 손상시킬 수 있으며 foo두 번째는 불평합니다.

cp비슷한 질문이 제기되었습니다.

/.일부 이전 버전의 SunOS를 사용할 때 시스템이 실제로 후행 파일 이름을 무시했기 때문에 추가하는 습관이 생겼습니다 /. 즉, /etc/motd/오류 대신 파일이 참조됩니다. SunOS/Solaris의 최신 버전에는 이 문제가 없는 것 같습니다.

답변2

이것은완전히도구에 따라 다릅니다. rm후행 슬래시가 있으면 디렉토리에 대한 심볼릭 링크를 삭제할 수 없으며 소스 파일 사양에 후행 슬래시가 있으면 rsync가 다르게 작동합니다.

답변3

foo/와 같은 foo/.것이므로 foo디렉터리에 대한 심볼릭 링크인 경우 foo/디렉터리(심볼릭 링크 아님)이고, foo디렉터리 또는 디렉터리에 대한 심볼릭 링크가 아닌 경우 액세스하려고 하면 ENOTDIR 오류가 발생합니다 foo/. 이것이 Linux에서의 동작입니다.

다른 시스템에서의 동작은 다를 수 있습니다.

바라보다여기그리고여기그리고여기POSIX/SUS가 이에 대해 어떻게 말하는지 확인하세요.

답변4

rsync에서 매뉴얼 페이지는 다음과 같습니다.

   A trailing slash on the source changes this behavior to avoid  creating
   an  additional  directory level at the destination.  You can think of a
   trailing / on a source as meaning "copy the contents of this directory"
   as  opposed  to  "copy  the  directory  by name", but in both cases the
   attributes of the containing directory are transferred to the  contain-
   ing  directory on the destination.  In other words, each of the follow-
   ing commands copies the files in the same way, including their  setting
   of the attributes of /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo

후행 슬래시목적지전혀 중요하지 않습니다. 소스 코드에서만 가능합니다. (물론 소스가 단일 파일이나 전역 변수가 아닌 디렉터리인 경우에만 중요합니다.)

디렉터리 간 사용 사례 설명:

$ mkdir foo bar baz
$ chmod 700 foo
$ chmod 750 bar
$ chmod 705 baz
$ echo hello > foo/file1
$ chmod 606 foo/file1 
$ ls -n
total 0
drwxr-x---  2 501  20   68 Aug  8 15:29 bar/
drwx---r-x  2 501  20   68 Aug  8 15:29 baz/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n foo
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rsync -a foo bar
$ rsync -a foo baz/
$ rsync -a foo bif
$ rsync -a foo bonk/
$ ls -n
total 0
drwxr-x---  3 501  20  102 Aug  8 15:30 bar/
drwx---r-x  3 501  20  102 Aug  8 15:30 baz/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bif/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

baz:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bif:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bonk:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rm -rf b*
$ mkdir bar baz
$ chmod 750 bar
$ chmod 705 baz
$ rsync -a foo/ bar
$ rsync -a foo/ baz/
$ rsync -a foo/ bif
$ rsync -a foo/ bonk/
$ ls -n
total 0
drwx------  3 501  20  102 Aug  8 15:30 bar/
drwx------  3 501  20  102 Aug  8 15:30 baz/
drwx------  3 501  20  102 Aug  8 15:30 bif/
drwx------  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

baz:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bif:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bonk:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ 

관련 정보