Unix: пересічення назви каталогів чи ні


13

Яка різниця між наступними командами?

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

Або немає різниці? Або це залежить від команди, яка використовується? Подумайте, наприклад, я читав, що поведінка rsync дещо змінюється залежно від версії, яку ви використовуєте. Хтось має гарне пояснення, тому мені більше не треба гадати і відчувати, що я знаю, що роблю?


2
Це правда для rsync. Він починає копіювання або з самого каталогу, або з елементів, що знаходяться під ним, залежно від того, пропустили ви чи додаєте косу рису відповідно.
maxelost

@maxelost: Чи можете ви додати відповідь за допомогою деяких прикладів, щоб було зрозуміло, що робити?
Свиш

Мікель відповіла на це досить чітко нижче, я думаю.
maxelost

Відповіді:


17

Багато утиліти Unix поводяться з посиланнями по-різному залежно від того, чи є косою косою рисою.

Така поведінка описана в документації 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

(деякі версії знахідки мають опцію -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копії 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).


Так, як я мав на увазі, команди можуть чи не можуть добре поводитися з косою косою рисою. Це дуже добре, що ви подали rsync як приклад!
jsalonen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.