В чем разница между именем каталога, которое заканчивается косой чертой, а другая – нет?

Существует ли какая-либо разница между именем каталога, таким как

mydirectory 

а также

 mydirectory/ 

Я заметил, что это происходит, когда я выполняю ls в некоторых каталогах – некоторые из названий каталогов имеют косую черту, а некоторые нет. Это проблематично, потому что, если я хочу получить доступ к файлу, содержащемуся в каталоге, мне может понадобиться добавить косую черту в конце:

 vi $mydirectory"/"$myfile 

или просто

 vi $mydirectory$myfile 

3 Solutions collect form web for “В чем разница между именем каталога, которое заканчивается косой чертой, а другая – нет?”

Без / это может быть файл.

В некоторых ситуациях это может быть смертельно опасно. Например, при использовании mv :

 mv file1 mydirectory mv file2 mydirectory mv file3 mydirectory 

Отлично? Но если mydirectory не существовал или не был каталогом, конечным результатом является то, что file1 и file2 исчезли, а mydirectory теперь называется mydirectory .

 mv file1 mydirectory/ mv file2 mydirectory/ mv file3 mydirectory/ 

Если mydirectory не существует, все, что вы получаете, это три сообщения об ошибках, а файлы file1 , file2 и file3 все еще существуют.

Таким образом, / устраняет некоторую двусмысленность.

Кроме того, на самом деле нет никаких правил. Некоторые программы могут вести себя по-разному в зависимости от того, поставили ли вы / в конце или нет. Им решать, что с этим делать.

В некоторых случаях вы также получаете проблемы, если используете слишком много / . Например, find сохраняет избыток / в своем выходе, что может вас опрокинуть, если вы попытаетесь найти файлы / пути, используя простые сравнения строк, а не, скажем, realpath или что-то в этом роде.

Вероятно, это будет «отображение» с ls , т. ls Если вы выполняете ls -p или ls -F , он должен последовательно добавлять косую черту после каталогов. Это существенно добавляет визуальные подсказки относительно того, что он считает файлом. (Имейте в виду, что -F также, например, добавляет @ к символическим ссылкам, * к файлам с исполняемыми разрешениями, | к именованным трубам, = к сокетам и т. Д.). Вы также можете воспроизвести ls -d directory/ vs ls -d directory .

/ и \0 Я считаю, что только два символа недействительны в имени файла / каталога.

Всегда добавление косой черты должно быть безопасным, если вы правильно назначили mydirectory и myfile, то vim "$mydirectory/$myfile" должен делать то, что вы ожидаете. (С предостережением $mydirectory и $myfile которые были назначены правильно). foo/bar и foo//bar должен быть эквивалентным.

В общем; Мне очень не нравится назначать вывод ls переменным и работать с ним, в первую очередь потому, что я раньше был удивлен, когда персонажи попали в имена файлов в сочетании с отсутствием цитирования, в результате получились деструктивные результаты. (Ie prefix=/home user=" oops" rm -rf $prefix$user , который закончит рекурсивно удалять /home , а затем пытается рекурсивно удалить ./oops ).

Вместо использования ls я стараюсь, когда могу, полагаться на расширение glob, bash или find -print0 | xargs -0 find -print0 | xargs -0 . Если вы используете ls , убедитесь, что вы НЕ используете существующий псевдоним для ls , и вы используете параметры отображения, которые соответствуют вашей конкретной задаче.

Если вы думаете о каталогах или папках в контексте «причудливого имени файла», папка по-прежнему является файлом, но папка скорее является указателем на контейнер, такой как папка с файлами в вашем шкафу подачи, поэтому, если вы обозначаете или используете косую черту / "или косой чертой" /. " для скрипта полезно знать, что вы не имеете в виду файл, а не папку.

Надеюсь, это имеет смысл.

Linux и Unix - лучшая ОС в мире.