查找非正则表达式白名单的文件

查找非正则表达式白名单的文件

我有一个包含数千个文件的巨大文件夹。有些文件中含有一些不允许的字符。 (UTF-8 符号)所以我有一个允许字符的白名单和一个 bash 脚本的开头,用于获取包含其路径的文件列表,其中有一些字符不在该白名单上。

#!/bin/bash
regex="^[a-zA-Z0-9._- ]+$"


while IFS=  read -r -d $'\0'; do
    filename=`echo "$REPLY" | rev  | cut -d/ -f1| rev`
    filepath=`echo "$REPLY" | rev  | cut -d/ -f2- | rev`

    if ! [[ "$filename" =~  "$regex" ]]
    then
            echo "$filepath $filename"
    fi
done < <(find /path/to/folder -type f -print0)

这是脚本的另一个开始

find /path/to/folder -type f -regextype posix-extended ! -iregex "\/([A-Z0-9\-\_\.\ \/]*)"

这是该存储中的一些文件

/symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/Probenbox_Probenkästen.pdf
/symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/Probenbox_final.pdf
/symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/._Probenbox_final.pdf

答案1

一个可能的解决方案是。将 grep 与 perl-regex 一起使用。其标志是 -P

例如,它应该如下所示:

#!/bin/bash

regex="[^-_0-9A-Za-z\. ]+"

while IFS=  read -r -d $'\0'; do
    filepath=${REPLY%/*}
    filename=${REPLY##*/}

    #use grep with perl-regex -P and 
    #-q for quiet to prevent output to stdin

    echo "$filename" | grep -qP "$regex" 
    #now we compare the return code from grep
    if  [[ "$?" -eq 0 ]]
    then
        echo "match: $filename"
    else
        echo "nomatch: $filename"

    fi


done < <(find /symlnks -type f -print0)

答案2

如果您想区分 ascii 和 utf,该命令file可能是您最好的选择。 man file了解详情。

以下是查找当前目录中名称为 ascii 或非 ascii 的所有文件的方法:

$ cat foo.sh
#!/bin/bash
echo "$1" > /tmp/name.txt
file /tmp/name.txt | grep -q $2
exit $?

$ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh {} UTF \; -a -print
./へ.txt
./robenbox_Probenkästen.txt
$ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh {} ASCII \; -a -print
./foo.txt
./log.txt
./utf8.txt

这是我的第一个答案...

因此:

$ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh {} ASCII \; -a -print
./ascii.txt
$ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh {} utf \; -a -print
./utf8.txt
$ cat foo.sh
#!/bin/bash
file $1 | grep -q $2
exit $?

因为:

$ cat ascii.txt 
English is a West Germanic language that was first spoken in early medieval England and is now a global lingua franca.
$ cat utf8.txt 
Texts written with Man'yōgana use two different kanji for each of the syllables now pronounced き ki, ひ hi, み mi, け ke, へ he, め me, こ ko, そ so, と to, の no, も mo, よ yo and ろ ro.
$ file ascii.txt 
ascii.txt: ASCII text
$ file utf8.txt 
utf8.txt: UTF-8 Unicode text
ken@ken-x230: ~$ od -c utf8.txt 
0000000   T   e   x   t   s       w   r   i   t   t   e   n       w   i
0000020   t   h       M   a   n   '   y 305 215   g   a   n   a       u
0000040   s   e       t   w   o       d   i   f   f   e   r   e   n   t
0000060       k   a   n   j   i       f   o   r       e   a   c   h    
0000100   o   f       t   h   e       s   y   l   l   a   b   l   e   s
0000120       n   o   w       p   r   o   n   o   u   n   c   e   d    
0000140 343 201 215       k   i   ,     343 201 262       h   i   ,    
0000160 343 201 277       m   i   ,     343 201 221       k   e   ,    
0000200 343 201 270       h   e   ,     343 202 201       m   e   ,    
0000220 343 201 223       k   o   ,     343 201 235       s   o   ,    
0000240 343 201 250       t   o   ,     343 201 256       n   o   ,    
0000260 343 202 202       m   o   ,     343 202 210       y   o       a
0000300   n   d     343 202 215       r   o   .  \n
0000313
ken@ken-x230: ~$ od -c ascii.txt 
0000000   E   n   g   l   i   s   h       i   s       a       W   e   s
0000020   t       G   e   r   m   a   n   i   c       l   a   n   g   u
0000040   a   g   e       t   h   a   t       w   a   s       f   i   r
0000060   s   t       s   p   o   k   e   n       i   n       e   a   r
0000100   l   y       m   e   d   i   e   v   a   l       E   n   g   l
0000120   a   n   d       a   n   d       i   s       n   o   w       a
0000140       g   l   o   b   a   l       l   i   n   g   u   a       f
0000160   r   a   n   c   a   .  \n
0000167

相关内容