【问题标题】:Check if filename characters match outside of whitelist检查文件名字符是否在白名单之外匹配
【发布时间】:2014-04-09 10:59:12
【问题描述】:

在bash 中,我想测试一些目录是否包含我列入白名单之外的文件名:

[a-z]
[A-Z]
[0-9]
[+-_ßäöüÄÖÜ.,]
[ ]

(即一个空格可以,连续两个或多个空格不行)。
尝试

$ ls my/dir/ |grep --color=always -v [a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X][Y][Z][0][1][2][3][4][5][6][7][8][9]

生成所有文件,甚至包含用于测试的# 字符的文件。

的“速记”也是如此
$ ls my/dir/ |grep --color=always -v [a-zA-Z0-9]

(是的,我知道稍后我必须在其中包含 [+-_ßäöüÄÖÜ., ] 字符)。

我已尝试为此使用diff:

$ diff -y <(ls -1 my/dir/) <(ls -1 /my/dir/|tr -cd '[a-zA-Z0-9\n\r \-\.\,]')|grep --color=never '|'|cut -d "|" -f 1

它输出我的tr 列表之外的文件名:

A File Containing Some Rainbo#ws.wav

但这似乎比较笨拙...有什么想法,嗯,更好?

【问题讨论】:

    标签: string bash whitelist


    【解决方案1】:
    $ find -name '*[^a-zA-Z0-9+\-_ßäöüÄÖÜ., ]*' -o -name '*  *'
    

    见man find。 -regex 和 -maxdepth 选项可能对您来说也很有趣。

    PS:Don't parse the output of ls.

    【讨论】:

    • 使用 find 将是我的首选方式,但您的解决方案不会显示包含字符 #(我的测试文件)的文件。您能否详细说明括号及其含义?我假设! 是not?所以上面写着find where name not includes [a-zA-Z0-9+\-_ßäöüÄÖÜ.,] or where name includes two spaces?多个空间呢?
    • @Christian 正确,它就是这样写的。我不能在没有进一步调查的情况下告诉你为什么# 不匹配,但我已经将否定移到字符类中,现在它匹配了。多个空格不是问题,因为three-spaces 是&lt;anything&gt;two-spaces&lt;anything&gt; 的子集(三个空格包括两个空格)。括号用于对表达式进行分组,但我已将其删除,因为此处不需要它们。 -o 是一个逻辑 OR。 [...] 是 character class。
    • 谢谢。像宣传的那样工作 - 我很高兴 ;)
    【解决方案2】:

    让你开始的东西:

    #!/bin/bash
    
    regex='^[a-zA-Z0-9.]+$'
    while read line
    do
        if ! [[ $(basename "$line") =~ $regex ]]
        then
            echo $line
        fi
    done < <(find . -type f)
    

    【讨论】:

    • 感谢您的开始,但我想我宁愿采用下面的find 方法,因为那是一种一次性解决方案。
    【解决方案3】:
    $ ls my/dir/ |grep --color=always -v [a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p][q][r][s][t][u][v][w][x][y][z][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X][Y][Z][0][1][2][3][4][5][6][7][8][9]
    

    上面的行会查找不包含字符序列abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789的文件名,这就是它匹配这么多文件的原因。

    试试

    $ ls my/dir/ |grep --color=always -v [^a-zA-Z0-9+-_ßäöüÄÖÜ. ]
    $ ls my/dir/ |grep --color=always "  "
    

    第一行查找包含白名单字符以外的其他字符的文件。 第二行查找包含双空格的文件。

    【讨论】:

    • 我会尽量记住这一点,以防我必须使用 ls 并且没有可用的 find。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多