在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
但这似乎相当笨拙 ......对某事的任何想法,好吧,更好?
答案 0 :(得分:3)
$ find -name '*[^a-zA-Z0-9+\-_ßäöüÄÖÜ., ]*' -o -name '* *'
请参阅man find
。 -regex
和-maxdepth
选项也可能对您感兴趣。
答案 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 " "
第一行查找包含除白名单之外的其他字符的文件。 第二行查找包含双倍空格的文件。