リモートの場所(/ mnt /)でファイルを検索し、ファイル名がこれらの条件に一致する場合は警告する必要があります。
ファイル名には大文字または数字のみを含める必要があります。
ファイル拡張子には、小文字のみを含める必要があります。
否定的な方法も機能します。
例:
ファイル名に小文字が含まれているか、拡張子に大文字が含まれている
エコーアラート
find
を使用してファイルを検索します。
find . -regex ".*/[A-Z0-9]+\.[a-z]+"
これにより、現在のディレクトリ(.
)で検索が実行され、サブディレクトリも再帰的に検索されます。
[.*/]
はファイルパスをカバーします[A-Z0-9]
は、AからZまでのすべての文字(@vidarloで言及されているÅを含む)およびから9までのすべての数字を表します+
は、先行する文字または式に1回以上一致します\.
はリテラルドットです[a-z]
はaからzまでのすべての文字を表しますいくつかの特殊文字については、例えば代わりに[[:upper:]]
:
find . -regextype egrep -regex ".*/[[:upper:][:digit:]]+\.[[:lower:]]+"
find
のテストを組み合わせるには、-a
と-o
があります。たとえば、次の場合に役立ちます。
find /mnt/ \( -name "*[a-z]*.*" -o -name "*.*[A-Z]*" \) -exec echo {} +
Bashだけで:
shopt -s extglob nullglob
cd /mnt
# just print the "good" files
printf "%s\n" +([[:upper:][:digit:]]).+([[:lower:]])
# or, report on all files
for f in *; do
if [[ $f == +([[:upper:][:digit:]]).+([[:lower:]]) ]]; then
echo "OK: $f"
else
echo "**: $f"
fi
done
Bashマニュアルの Pattern matching をご覧ください。
find
シェルスクリプトを使用したコマンドFindコマンドとシェルスクリプトを使用した次の方法が機能するかどうか試してください。変更できます
find
コマンドラインまさにあなたが望むものに合うように。
find -type f -exec ./checker {} \; | sort
checker
には次が含まれます
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage: $0 <filename>"
echo "Enter the file name as a parameter"
exit
fi
inversvid="\0033[7m"
redback="\0033[1;37;41m"
resetvid="\0033[0m"
filnam=${1##*/}
name=${filnam%\.*}
upnam=${name^^}
ext=${filnam##*.}
loex=${ext,,}
if [ "${filnam^^}" == "$upnam" ]
then
corrfile=$upnam
else
corrfile="$upnam.$loex"
fi
if [ "$corrfile" == "$filnam" ]
then
echo -e " good match: '$filnam'"
else
echo -e "$redback bad match: '$filnam' does not match '$corrfile' $resetvid"
fi
checker
を実行可能にし、ローカルで呼び出します。 ~/bin
に入れてPATH
にすると、checker
で呼び出すことができます。
chmod ugo+x checker