检查文件名字符是否与白名单外匹配

时间:2014-04-09 10:59:12

标签: string bash whitelist

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

但这似乎相当笨拙 ......对某事的任何想法,好吧,更好

3 个答案:

答案 0 :(得分:3)

$ find -name '*[^a-zA-Z0-9+\-_ßäöüÄÖÜ., ]*' -o -name '*  *'

请参阅man find-regex-maxdepth选项也可能对您感兴趣。

PS:Don't parse the output of ls

答案 1 :(得分:3)

让你入门的东西:

#!/bin/bash

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

答案 2 :(得分:0)

$ 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 "  "

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