Bash

查找文件不是正則表達式白名單

  • April 6, 2019

我有一個包含數千個文件的巨大文件夾。有些文件中有一些字元,這是不允許的。(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)

引用自:https://unix.stackexchange.com/questions/247385