Когда следует использовать конечную косую черту в каталоге?

Возможный дубликат:
Как linux обрабатывает несколько разделителей путей (/ home //// имя пользователя /// file)

Большинство команд, которые я использую в linux, ведут себя одинаково, независимо от того, включаю ли я конечный слэш / символ в конце имени каталога или нет.

Например:

 ls /home/cklein ls /home/cklein/ cp foo bar cp foo/ bar/ 

Когда это завершающее косая черта? Что такое семантический смысл конечной косой черты?

4 Solutions collect form web for “Когда следует использовать конечную косую черту в каталоге?”

Он полностью зависит от инструмента. rm не позволит вам удалить символическую ссылку в каталог, если в конце есть косая черта, а rsync выполняет разные вещи, если спецификация исходного файла имеет косую черту в конце.

Одним хорошим примером является перемещение файла в каталог:

 mv some_file foo 

против

 mv some_file foo/ 

Если foo не существует, первый переименует some_file в foo , а не в предполагаемый foo/some_file ; второй будет жаловаться, а это то, что вы хотите.

Если foo существует, но не является каталогом, первый может скрыть файл foo ; снова, второй будет жаловаться.

cp представляет аналогичные проблемы.

Работая над некоторыми старыми версиями SunOS, я разработал привычку добавлять /. , потому что система фактически игнорировала конечное / имя файла; например, /etc/motd/ будет ссылаться на файл, а не на ошибку. Более поздние версии SunOS / Solaris, похоже, не имеют этой проблемы.

foo/ как foo/. , так что если foo является символической ссылкой на каталог, foo/ является каталогом (а не символической ссылкой), и если foo не является каталогом или символической ссылкой на каталог, то вы получаете ошибку ENOTDIR для чего-либо, пытающегося получить доступ к foo/ . Это поведение в Linux.

Поведение может отличаться в других системах.

Смотрите здесь и здесь и здесь, чтобы узнать, что POSIX / SUS может сказать об этом.

В 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---rx 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---rx 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 $ 
  • Разрешения для каталога vs file permssions
  • Как интерпретация оболочки ././command-name?
  • обрабатывать файлы в каталоге по мере их появления
  • updatedb для начинающих
  • Где разместить исходный код для приложений, скомпилированных из исходного кода?
  • Как выполнить команду bash во всех возможных подкаталогах?
  • Есть ли инструмент, который подключается к двум каталогам и синхронизирует их, как только что-то меняется?
  • Архив с длинным именем файла внутри - unarchiver достигает предела файловой системы и не работает
  • Зеркалирование двух каталогов
  • Как определить, создается ли директория системой или пользователем root?
  • Что такое xhbin?
  • Linux и Unix - лучшая ОС в мире.