web-dev-qa-db-fra.com

Rechercher des fichiers avec des lettres majuscules avant l'extension et des lettres minuscules dans l'extension

Je dois rechercher des fichiers dans un emplacement distant (/ mnt /) et alerter si un nom de fichier correspond à ces critères:

  1. Le nom du fichier ne doit contenir que des lettres majuscules ou des chiffres.

  2. L'extension de fichier ne doit contenir que des lettres minuscules.

La manière négative fonctionnera également.

exemple:

si le nom du fichier contient des lettres minuscules et/ou l'extension contient des lettres majuscules

alors - alerte d'écho

4
yarone

Utilisez find pour rechercher des fichiers:

find . -regex ".*/[A-Z0-9]+\.[a-z]+"

Ceci effectue la recherche dans le répertoire actuel (.), en passant récursivement dans les sous-répertoires.

  • [.*/] couvre le chemin du fichier
  • [A-Z0-9] signifie chaque lettre de A à Z (y compris, par exemple, Å mentionné par @vidarlo) et chaque chiffre compris entre 0 et 9
  • + correspond au caractère ou à l'expression précédent une ou plusieurs fois
  • \. est un point littéral
  • [a-z] signifie chaque lettre de a à z

Pour certains caractères spéciaux, il peut être nécessaire d’utiliser par exemple [[:upper:]] à la place:

find . -regextype egrep -regex ".*/[[:upper:][:digit:]]+\.[[:lower:]]+"

Question modifiée

Pour combiner les tests de find, il existe -a et -o, pour votre exemple, cela pourrait vous aider:

find /mnt/ \( -name "*[a-z]*.*" -o -name "*.*[A-Z]*" \) -exec echo {} +
6
dessert

Juste avec 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

Voir Pattern matching dans le manuel bash.

4
glenn jackman

find commande utilisant un script de shell

Essayez si la méthode suivante avec une commande find et un shellscript fonctionne. Vous pouvez modifier

  • la ligne de commande find et
  • le shellscript (par exemple la sortie)

s'adapter exactement à ce que vous voulez.

find -type f -exec ./checker {} \; | sort

checker contient

#!/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

J'ai rendu checker exécutable et je l'ai appelé localement. Vous préférerez peut-être l'insérer dans ~/bin, ce qui l'amènera dans PATH afin que vous puissiez l'appeler avec checker.

chmod ugo+x checker

Tester

enter image description here

3
sudodus