Étant donné que vos noms de fichiers sont au format file.00064.name.99999.end
, nous devons d'abord supprimer tout sauf notre numéro. Nous allons utiliser une for
boucle pour ce faire.
Nous devons également dire au shell Bash d'utiliser la base 10, car l'arithmétique Bash traitera les nombres commençant par un 0 comme base 8, ce qui gâchera les choses pour nous.
En tant que script, pour être lancé dans le répertoire contenant les fichiers, utilisez:
#!/bin/bash
for f in ./*
do
if [[ -f "$f" ]]; then
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
else
echo "$f is not a file, skipping."
fi
done
Ou vous pouvez utiliser cette très longue commande laide pour faire la même chose:
for f in ./* ; do if [[ -f "$f" ]]; then file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; else echo "$f is not a file, skipping."; fi; done
Pour expliquer toutes les parties:
for f in ./*
signifie pour tout dans le répertoire courant, faire .... Ceci définit chaque fichier ou répertoire trouvé comme variable $ f.
if [[ -f "$f" ]]
vérifie si l'élément trouvé est un fichier, sinon nous sautons à la echo "$f is not...
partie, ce qui signifie que nous ne commençons pas à supprimer les répertoires accidentellement.
file="${f%.*}"
définit la variable $ file comme nom de fichier, supprimant tout ce qui vient après le dernier .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
C'est là que l'arithmétique principale entre en jeu. Le ${file##*.}
coupe tout avant le dernier .
dans notre nom de fichier sans extension. $(( $num % $num2 ))
est la syntaxe pour que l'arithmétique Bash utilise l'opération modulo, la commande 10#
indique au début à Bash d'utiliser la base 10 pour gérer les 0 en tête embêtants. $((10#${file##*.} % 12))
nous laisse ensuite le reste de notre nombre de noms de fichiers divisé par 12.-ne 0
vérifie si le reste n'est "pas égal" à zéro.
- Si le reste n'est pas égal à 0, le fichier est supprimé avec la
rm
commande, vous voudrez peut-être le remplacer rm
par echo
lors de la première exécution, pour vérifier que vous obtenez les fichiers attendus à supprimer.
Cette solution est non récursive, ce qui signifie qu'elle ne traitera que les fichiers du répertoire en cours, elle n'ira dans aucun sous-répertoire.
L' if
instruction avec la echo
commande pour avertir des répertoires n'est pas vraiment nécessaire car rm
elle se plaindra des répertoires et ne les supprimera pas, donc:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Ou
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Fonctionnera correctement aussi.