LINUX.ORG.RU
ФорумAdmin

Проверка соответствия строки требованиям пути в FS Linux и Windows

 ,


0

2

Пишу скрипт на bash, нужно проверять переменную на соответствия требованиям пути в фс как в линуксе, так и в винде.
Нужно в обеих, потому что, например, в линуксе можно создавать файлы с двоеточием в названии или с одними пробелами, а винда такие файлы читать не может. Да чего уж там, в линуксе можно создать файл с символами переноса строки, или вообще с пустым названием. Такие файлы не то что access, их удалить можно только удалением папки, в которой они находятся, не говоря уже о том, что можно вытварять с запросами на такие файлы.
Я так понял, linux - ОС неограниченных возможностей, но ведь есть же какие-то требования адекватности названий файлов и папок для вменяемой работы с этими файлами и папками?

Нужно предотвратить указание неадекватного пути, которое может быть неправильно понято линуксом и виндой, и при существовании которого линукс и винда могут неадекватно работь с таким файлом/папкой.
Ну я так понял можно использовать alphanumeral chars, нижнее подчеркивание, дефис, скобочки, тильду (в некоторых темперальниках и в винде и в линуксе видел), пробелы (но не одни пробелы), точки (но не одни точки).
1. Есть еще что-то, что я не учел? Может какие-то символы еще нужны?
2. Как это реализовать программно?

В программе нужно, чтобы путь начинался со слеша, нельзя чтобы заканчивался слешом, и путь не должен содержать кавычки.
Вот шаблон:

function read_path() {
    path=""
    path_correct=false
    path_cancel=false
    while [[ $path_correct = false ]] && [[ $path_cancel = false]]; do
        echo "Enter path:"
        read path
        if [[ "$path" == "cancel" ]]; then
            path_cancel=true
        elif [[ "$path" == [^/]* ]]; then
            echo "you should specify full absolute path that starts with slash \"/\""
        elif [[ "$path" == */ ]]; then
            echo "please dont use slash \"/\" at the end of path"
        elif [[ вот тут проверка ]]; then
            echo "perfect, the path is ok, please proceed"
            path_correct=true
        else
            echo "the path has some unallowed symbols"
        fi
    done
}

Для проверки я пробовал такие проверки:
[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]
Ничего из этого не работает так, как надо.



Последнее исправление: Kukuster (всего исправлений: 3)

Такие файлы не то что access, их удалить можно только удалением папки, в которой они находятся, не говоря уже о том, что можно вытварять с запросами на такие файлы.

4.2

arturpub ★★
()

Вы можете вводить любые ограничения на имя файла, но всякое такое:

пробелы (но не одни пробелы), точки (но не одни точки)

лучше не засовывать в один regexp, делайте последовательные проверки, иначе потом сами не поймёте что у вас эта регулярка значит и как её исправить/дополнить.

mky ★★★★★
()

В GNU/Linux действительно можно делать имена файлов со специальными и даже контрольными символами, но удалить их можно без проблем, например, контрольные символы можно вводить нажимая ctrl-v ctrl-m или что-то другое — я проверил, в баше получается вводить всё контрольные кроме ^@, который нулевой, но его можно ввести как $'\0', и манипулировать этими файлами можно совершенно свободно, если их имя указать команде rm или иной.

Xenius ★★★★★
()

Мне всегда казалось, что в линуксах (ext4 в частности) имя файла может содержать в себе любые символы кроме '/'. До тех, пока его длина не выходит за границы системных лимитов. И это норма. Зачем нужны глупые ограничения в духе «привет 70е» в наше время?

anonymous
()
Ответ на: комментарий от Deleted

не запрещенные, а есть термин «зарезервированные слова».
на практике во многих ЯП нерекомендуется использовать зарезервированные слова в именах идентификаторов.

bl ★★★
()
Ответ на: комментарий от Xenius

но его можно ввести как $'\0'

это ты с zsh перепутал

salsa
()
Ответ на: комментарий от Xenius

в баше получается вводить всё контрольные кроме ^@, который нулевой

А он и не может фигурировать в имени файла, так что всё в порядке.

Вот определение в SUS:

3.170 Filename

A sequence of bytes consisting of 1 to {NAME_MAX} bytes used to name a file. The bytes composing the name shall not contain the <NUL> or <slash> characters. In the context of a pathname, each filename shall be followed by a <slash> or a <NUL> character; elsewhere, a filename followed by a <NUL> character forms a string (but not necessarily a character string). The filenames dot and dot-dot have special meaning.

anonymous
()
Ответ на: комментарий от anonymous

Я ж оговаривал Винду, так что я не про ext, а про всякие обыденные ФС для ПК: NTFS, fat, ext'ы
Мне нужно чтобы:
1. Проводники на линуксе без проблем считывали пути
2. Винда распознавала этот же путь
3. Виндячие проводники без проблем читали этот же путь.
И не надо мне говорить, что мол мы такие молодцы, знаем как обращаться со всеми символами, и это нам не нужно. Я бы тогда программу не писал, но это же для удобства, и вообще она пригодится ещё и для некоторых пользователей Ubuntu/Windows, которые не шарят в программировании.

Kukuster
() автор топика
Ответ на: комментарий от Kukuster

Все пути, корректные для винды, корректны и для линукса (с заменой слеша и отсутствием имени диска, естественно). Вывод: проверяй только виндовую корректность.

Ссылка на статью на msdn выше уже была.

anonymous
()
Ответ на: комментарий от anonymous

Вывод: проверяй только виндовую корректность

Ты забыл про 255 _байт_ на имя файла в линуксе против 255 _символов_ в NTFS. 250 русских букв займут 500 байт в UTF-8 и не влезут в линуксовые ограничения, хотя будут вполне корректным именем в винде.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Ты забыл про 255 _байт_ на имя файла в линуксе против 255 _символов_ в NTFS. 250 русских букв займут 500 байт в UTF-8 и не влезут в линуксовые ограничения, хотя будут вполне корректным именем в винде.

Хм, в самом деле.

А там точно «255 символов», а не «255 сломанных кодепойнтов 16-битного недоюникода, которые обычно равны одному символу, но не всегда»?

anonymous
()

Вопрос. В шинду завезли баш? Я думаю там он излишен. Тем более для людей не умеющих в программирование (как я).

3.5 латентных линуксоида с винфака не в счёт.

yacuken ★★★★
()
Ответ на: комментарий от yacuken

это для пользования только на линуксе, но нужно чтобы создаваемый путь был appropriate и в винде, т.к. будет ссылатся на раздел, который используется и виндой и линуксом

Kukuster
() автор топика

Винда еще плохо реагирует на точку в конце имени файла.

handbrake ★★★
()
Ответ на: комментарий от redgremlin

Ты забыл про 255 _байт_ на имя файла в линуксе против 255 _символов_ в NTFS

А ещё на FAT можно создавать каталоги с двумя точками (..) в имени через пути в UNC.

h578b1bde ★☆
()
Ответ на: комментарий от Kukuster

Можно такой файл создать, «не очень традиционным способом» но можно. Я когда-то давно ради теста делал такое.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.