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