Je dois rechercher des fichiers dans un emplacement distant (/ mnt /) et alerter si un nom de fichier correspond à ces critères:
Le nom du fichier ne doit contenir que des lettres majuscules ou des chiffres.
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
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 à zPour certains caractères spéciaux, il peut être nécessaire d’utiliser par exemple [[:upper:]]
à la place:
find . -regextype egrep -regex ".*/[[:upper:][:digit:]]+\.[[:lower:]]+"
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 {} +
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.
find
commande utilisant un script de shellEssayez si la méthode suivante avec une commande find et un shellscript fonctionne. Vous pouvez modifier
find
ets'adapter exactement à ce que vous voulez.
find -type f -exec ./checker {} \; | sort
où 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