在Linux和Windows上检查字符串是否可以作为文件系统路径。

3
我正在尝试编写一个bash脚本,在其中必须读取用户输入的字符串。我需要这个字符串能够成为适当的路径(父目录和目标文件或目录的分支),并且可以在Linux和Windows上适当访问。
这与目录名称和文件名称有关。我需要它们符合Linux和Windows的要求。我知道在Linux中使用bash 4.x(也许4不是决定性的)可以创建包含任何字符的文件名,但我可能会遇到访问此类文件的问题。
到目前为止,我知道:
- 与Linux不同,Windows无法访问其名称中带有冒号的文件。 - 与Windows不同,Linux可能会在访问名称中带有惊叹号的文件时出现问题。 - Windows不允许只包含空格的名称。 - Linux和Windows都不允许“.”和“..”名称。 - Windows不允许只包含点的名称。
等等。
是否有POSIX标准或一些规则或其他符合Linux和Windows要求的东西?哪些字符在两者上都被允许,有什么例外?
此外,我很难检查字符串是否是适合的路径。我假设可以使用字母数字字符、下划线、连字符、圆括号、波浪线、空格和点。我还假设路径应以斜杠开头,而不以斜杠结尾。
我尝试了像这样的正则表达式,但它们没有按照我的要求工作:
[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\ \(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]

我只是不明白bash正则表达式的所有细节。

那么,有哪些要求以及验证它们的更好方法是什么?


几乎所有你在任何Linux发行版上实际看到的文件系统都可以很好地处理'!'。你可能没有必要将其排除在外。 - user2845360
看一下这篇文章:http://superuser.com/questions/528503/determining-if-an-argument-looks-like-a-valid-path?newreg=2f708a2230c34ab2937278bc8003807f 它指出没有办法提供一个通用的过滤器。你需要制作一个自定义实现,限制你不想在启用路径中拥有的字符。 - Cristian Ramon-Cortes
像Linux的ext4这样的POSIX文件系统应该接受除NULL和斜杠(/)之外的任何ASCII字符,斜杠是保留用于目录结构。您不能有名为...的文件,因为它们已经(隐式地)被认为是指当前目录或其父目录。我曾经读过一个邪恶的QA文件系统测试:一个包含254个文件的目录,每个文件都以除null和斜杠之外的每个ASCII字符命名。它几乎会破坏一切。 - Adam Katz
1个回答

1
我会编写一个白名单脚本,接受Windows和Unix环境下路径名称的最小公共分母,但我猜当涉及文件前缀和分隔符时,必须区分Windows和Unix世界。以下脚本可能作为起点很有用。您可以将路径作为第一个参数传递给脚本,当路径正确(即满足正则表达式)时返回OK,否则返回NOK。对于正则表达式匹配,我在脚本中使用了egrep(选项-x表示给定字符串必须完全匹配字符串)。$?表示egrep的返回值 --- 如果为零,则参数路径成功匹配正则表达式。
最好, 朱利安
#!/bin/bash

DELIM="/"
FILE="[a-zA-Z]([a-zA-Z0-9])*"
R="(${DELIM})?${FILE}(${DELIM}${FILE})*${DELIM}?"

path=$1

echo "$path" | egrep -x "$R"

[ $? -eq 0 ] && {
    echo "OK"
    exit 0
}

echo "NOK"
exit 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接