정규식 화이트리스트에 포함되지 않은 파일 찾기

정규식 화이트리스트에 포함되지 않은 파일 찾기

수천 개의 파일이 들어 있는 거대한 폴더가 있습니다. 일부 파일에는 허용되지 않는 문자가 포함되어 있습니다. (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

가능한 해결책 중 하나는 다음과 같습니다. perl-regex와 함께 grep을 사용하십시오. 해당 플래그는 -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

관련 정보