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