Bash
查找文件不是正則表達式白名單
我有一個包含數千個文件的巨大文件夾。有些文件中有一些字元,這是不允許的。(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
一個可能的解決方案是。將 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)