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)

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

Xenius ★★★★★
()
Ответ на: комментарий от 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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.