正規表現ホワイトリストに含まれていないファイルを探す

正規表現ホワイトリストに含まれていないファイルを探す

何千ものファイルを含む巨大なフォルダがあります。一部のファイルには許可されない文字が含まれています。 (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

考えられる解決策の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)

おすすめ記事