В чем разница между следующими командами?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
Или нет разницы? Или это зависит от используемой команды? Например, я прочитал, что поведение rsync немного меняется в зависимости от используемой версии. У кого-нибудь есть хорошее объяснение, чтобы мне больше не приходилось догадываться и чувствовать, что я знаю, что делаю?
Ответы:
Многие утилиты Unix обрабатывают символические ссылки по-разному в зависимости от того, есть ли косая черта.
Это поведение описано в документации по символическим ссылкам POSIX, а также в документации GNU coreutils .
По сути, косая черта означает следовать (или «разыменовывать») символическую ссылку.
Например, в приведенном ниже коде
dirlink
означает символическую ссылку, ноdirlink/
означает каталог, на который указывает символическая ссылка.rm
не удалит каталог, если вы не скажетеrm -r
, ноrm
без параметров удастся удалить символическую ссылку.Это также полезно для просмотра прав доступа к каталогу без необходимости беспокоиться о том, является ли каталог настоящим каталогом или просто символической ссылкой на каталог.
и это все еще работает для обычных каталогов:
Другой пример -
find
команда. Еслиpath
вы просите его найти символическую ссылку, по умолчанию она не будет следовать символической ссылке, то есть обрабатывает только символическую ссылку. Добавление косой черты заставляет ее обрабатывать символическую ссылку как каталог, на который указывает ссылка.(в некоторых версиях find есть опция
-follow
or-L
, но она позволяет следовать всем символическим ссылкам, а не только первой)В случае
rsync
, если вы должны добавить косую черту, зависит от того, хотите ли вы, чтобы каталог, который вы копируете, был подкаталогом или нет.Другими словами:
rsync dir dir.bak
копируетdir
вdir.bak
, делаяdir
внутриdir.bak
rsync dir/ dir.bak
копирует все содержимоеdir
, не делаяdir
внутриdir.bak
источник
Как уже сказал jsalonen, эти команды действительно имеют идентичные результаты, если
foo
иbar
являются, по сути, каталогами.Однако, если
foo
иbar
не являются каталогами, то команда завершится неудачно, если вы добавите завершающий слеш, и завершится успешно, если вы этого не сделаете. Дело в том, что если команда будет выполнена успешно, то, вероятно, у нее не будет ожидаемого результата. На самом деле, вы можете даже потерять данные, еслиfoo
иbar
файлы (bar
будут перезаписаны).Если вы намереваетесь указывать каталоги, а не файлы, то вам следует использовать косую черту, поскольку это делает команду более устойчивой: если ожидание того, что каталоги
foo
илиbar
являются каталогами, не удастся выполнить, то команда будет выполнена изящно, вместо неожиданных результатов.Кроме того, некоторые (редкие) команды ведут себя по-разному в зависимости от наличия косой черты, даже с каталогами (один из примеров
rsync
).источник