web-dev-qa-db-ja.com

拡張子の前に大文字、拡張子に小文字のファイルを検索します

リモートの場所(/ mnt /)でファイルを検索し、ファイル名がこれらの条件に一致する場合は警告する必要があります。

  1. ファイル名には大文字または数字のみを含める必要があります。

  2. ファイル拡張子には、小文字のみを含める必要があります。

否定的な方法も機能します。

例:

ファイル名に小文字が含まれているか、拡張子に大文字が含まれている

エコーアラート

4
yarone

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 {} +
6
dessert

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 をご覧ください。

4
glenn jackman

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

テスト

enter image description here

3
sudodus