Как Linux обрабатывает несколько последовательных разделителей пути (/, размещают////имя пользователя///файл)?

Мне нравится Perl так:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Можно также использовать тот же шаблон для других задач как копирование файлов к другому каталогу:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
115
03.04.2015, 11:50
6 ответов

Несколько наклонных черт позволяются и эквивалентны единственной наклонной черте. От Единственной спецификации Unix (версия 4) основывайте определения §3.271 путь: “Несколько последовательных наклонных черт считаются тем же как одной наклонной чертой”.

Существует одно исключение: Если путь начинается с двух последовательных символов, первый компонент после начальных символов может быть интерпретирован определенным реализацией способом. (касательно: основные определения §4.13 разрешение пути). Сам Linux не делает этого, хотя некоторые приложения могли бы, и другая система выхода Unix делает (например, Cygwin).

Запаздывание / в конце пути вынуждает путь обратиться к каталогу. В (POSIX 1003.1-2001 (Единственный Unix v4) основывают определения §4.11 разрешение пути, запаздывание / эквивалентно запаздыванию /.. POSIX 1003.1-2008 (Единственный Unix v4) основные определения §4.13 удаляет требование для создания этого эквивалентным /., для преодоления несуществующих каталогов (например. mkdir foo/ требуется, чтобы работать, тогда как mkdir foo/. не был бы — видеть объяснение для изменения).

Для программ, которые действуют на запись каталога, если foo символьная ссылка на каталог, затем передавая foo/ путь состоит в том, чтобы заставить программу действовать на каталог вместо символьной ссылки.

¹ Примечание, что это запрашивает разрешение пути только, т.е. при доступе к файлам. Манипуляции именем файла могут работать по-другому. Например, basename и dirname проигнорируйте запаздывание наклонных черт.

171
27.01.2020, 19:29
  • 1
    Эквивалент /. был удален после более позднего процесса обсуждения, поскольку это было неоднозначно. Так или иначе +1 как находящий этот вид информации, хорошо полученной в итоге, твердо. –  hakre 26.07.2014, 15:03

ОС, кажется, не заботится об этом также, только что испытав программу C с прямым syscall для открытия//в пути.

Можно использовать библиотечную функцию Python os.path.normpath для нормализации его, хотя, который сохраняет Вас имеющий необходимость просканировать через строку, ища отдельно оплачиваемые предметы. Другие языки имеют подобные функции.

http://docs.python.org/library/os.path.html#os.path.normpath

17
27.01.2020, 19:29
  • 1
    Остерегайтесь следующего комментария в источнике normpath: Нормализуйте путь, например,//B, A/./B и A/foo/../B, все становятся A/B. Нужно подразумевать, что это может изменить значение пути, если это содержит символьные ссылки! –  Bluehorn 17.11.2014, 22:36

Во всех системах Unix, что я видел, что это совпадает с синглом /, но стандарт Unix указывает это

Путь, который начинается с двух последовательных наклонных черт, может быть интерпретирован определенным реализацией способом, хотя больше чем две ведущих наклонных черты нужно рассматривать как единственную наклонную черту.

таким образом, это может быть обработано особенно, в зависимости от Вашей системы. (Некоторые более старые версии Unix использовали двойное продвижение / для доступа удаленной файловой системы, и могут все еще быть некоторые, которые делают.)

9
27.01.2020, 19:29
  • 1
    Cygwin (в то время как не реальный UNIX) действительно переводит //remote/... к доступу удаленной файловой системы, вероятно, для непротиворечивости с Windows \\remote\.... –  ephemient 20.01.2011, 02:33
  • 2
    я верю (но не может погуглить хорошую ссылку прямо сейчас), что Windows POSIX разделяет API, будет также рассматривать //remote/... то же как путь UNC \\remote\... формат. –  Stephen P 20.01.2011, 02:39
  • 3
    я думаю, что вспоминаю то Повышение. Портативный дескриптор путей файловой системы // специальным способом, которым они могут протестировать false для того, чтобы быть абсолютным, соответствуя спецификации Unix/POSIX. –   20.01.2011, 02:52

Использовать os.path.join в Python и Вы не получите несколько наклонных черт. Создание имен файлов самостоятельно путем конкатенации строк считают плохим стилем Python.

7
27.01.2020, 19:29
  • 1
    , который я согласовываю, но имя файла является частью командной строки, и вместо того, чтобы анализировать командную строку для добавления к имени файла (в конце), я был бы точно так же, как для добавления его. –  Falmarri 13.09.2010, 04:02
  • 2
    @Falmarri: Вы не можете только добавить имя файла к командной строке! Командная строка будет проанализирована оболочкой, таким образом, специальные символы в именах файлов должны будут быть заключены в кавычки. Таким образом, действительно необходимо создать имя файла, затем заключите его в кавычки правильно для помещения его в командную строку. –  Gilles 'SO- stop being evil' 13.09.2010, 10:19
  • 3
    Это - действительно определенный проект, что я в значительной степени просто собираюсь быть использованием меня. Я, вероятно, не был достаточно ясен выровнять по ширине не быть устойчивым об этом. Я получаю эту строку пути к файлу от класса, который дает мне правильно завершенный путь к файлу и такой. И я добавляю его к параметру командной строки –  Falmarri 13.09.2010, 10:38
  • 4
    @Falmarri на 64 бита и на 32 бита: Так используйте normpath для чистки значения командной строки, которым Вы не управляете и затем используете соединение для соединения их. –  Neil Mayhew 20.09.2010, 18:49
  • 5
    Это на самом деле, что я закончил тем, что делал = \, я не мог обработать особый случай, где мне просто дали / очень хорошо. –  Falmarri 20.09.2010, 20:44

Нет никакого различия.

Несколько наклонных черт проигнорированы (без эффекта), например:

ls -al //usr///////bin/sed
3
27.01.2020, 19:29
  • 1
    Может быть то, если это точно два и вначале; путь, который начинается с двух последовательных наклонных черт, может быть интерпретирован определенным реализацией способом. На практике я думаю, что это правильно, и они просто проигнорированы –  Michael Mrozek♦ 20.01.2011, 02:22
  • 2
    Спасибо Chris, я ценю разъяснение! (к сожалению, вход в систему OpenID не работает на меня, или я проголосовал бы за Вас), –   20.01.2011, 02:23
  • 3
    @Rob, Вы не зарегистрированы, но все еще вошли в систему (Вы прослежены Вашим cookie). Необходимо смочь зарегистрироваться теперь для соединения OpenID с учетной записью, но необходимо смочь голосовать так или иначе –  Michael Mrozek♦ 20.01.2011, 02:28
  • 4
    Спасибо, которым Michael, но "необходимо быть, входит в систему или регистрируется для голосования". Когда Вы используете просто адрес электронной почты и называете Вас, не имеют полных полномочий. И так как OpenID испытывает таймаут, и я не испытываю желание создавать другую учетную запись, мне не повезло. Мой отказ для того, чтобы быть ленивым я предполагаю, но я ценю справку. –   20.01.2011, 02:35

Конечно, можно нормализовать путь с возможным несколько / (наклонные черты) в нем путем передачи его через tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... и затем используйте $NORMALIZED

Однако это должно быть необходимо. Что касается того, поскольку я знаю любого правильно, что ядро UNIX должно проигнорировать параллельные разделители пути---или концептуально обработка их как..././...

0
27.01.2020, 19:29

Теги

Похожие вопросы