#1 Le 27/10/2017, à 17:19
- josran
[Résolu] Test de 2 chaînes de caractères
Bonjour,
J'ai un ensemble de fichiers dont le nom se termine par "aammjj.mp4" et je souhaite déplacer tous ceux dont la date aammjj est inférieure à une date qui me sert de base de comparaison.
Voici mon script :
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/local/bin
cd /home/tt/Tempo
ls Nightly_* > liste1
mydate=$(date +"%y%m%d")
datebase=$mydate".mp4"
echo
while read line; do
echo "Ligne lue:" $line
fin=$(echo `expr length $line`)
myarg=$(echo ${line:$fin-10:10})
echo "Argument:" $myarg
echo "Base:" $datebase
if [ $myarg < $datebase ]
then
echo "DEPLACER" $line
else
echo "Ok:" $myarg
fi
done < liste1
Or l'exécution échoue sur l'instruction "if" avec un message qui ne m'éclaire pas du tout sur la correction à apporter ;
Ligne lue: Nightly_News_Full_Broadcast_Oct._20th-nn_netcast_171020.mp4
Argument: 171020.mp4
Base: 171027.mp4
./estrNBC2.sh: ligne 15: 171027.mp4: Aucun fichier ou dossier de ce type
Ok: 171020.mp4
Je me dis que la correction ne doit pas tenir à grand chose mais à quoi ?
Dernière modification par josran (Le 28/10/2017, à 05:00)
Hors ligne
#2 Le 27/10/2017, à 17:28
- Watael
Re : [Résolu] Test de 2 chaînes de caractères
salut,
UMQ! : Use More quotes !
expr est un programme externe inutile; utilise plutôt le remplacement des paramètres (cf. man bash).
le echo est aussi inutile : expr affcihe les données demandées tout seul.
pareil pour myarg.
il faut protéger <, sinon ce caractère spécial effectue une redirection.
il faut extraire complètement la date du nom de fichier à tester pour effectuer une comparaison arithmétique (cf. help test).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 28/10/2017, à 04:51
- josran
Re : [Résolu] Test de 2 chaînes de caractères
Merci de ta réponse Watael.
humm...4846 lignes de man bash, même redirigées dans un fichier, c'est un peu trop pour mon appétit modéré.
A partir de tes pistes, j'ai donc repris mes recherches et apporté les corrections suivantes :
longueur_de_chaîne=${#chaîne} et plus de expr ni de length
les variables comparées protégées par des quotes "variable"
l'opérateur de comparaison protégé par des apostrophes '<'
suppression des echo inutiles
ce qui me donne :
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/local/bin
cd /home/tt/Tempo
ls Nightly_* > liste1
mydate=$(date +"%y%m%d")
echo
while read line; do
echo "Ligne lue:" $line
fin=${#line}
myarg=${line:$fin-10:6}
echo "Argument:" $myarg
echo "Base:" $mydate
if [ "$myarg" '<' "$mydate" ]
then
echo "DEPLACER" $line
else
echo "Date Ok:" $myarg
fi
done < liste1
et le résultat :
Ligne lue: Nightly_News_Full_Broadcast_Oct._20th-nn_netcast_171020.mp4
Argument: 171020
Base: 171028
Hors ligne
#4 Le 28/10/2017, à 06:09
- pingouinux
Re : [Résolu] Test de 2 chaînes de caractères
Bonjour,
Tu peux encore simplifier un peu (variable fin et fichier liste1 inutiles) :
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/local/bin
cd /home/tt/Tempo
#ls Nightly_* > liste1
mydate=$(date +"%y%m%d")
echo
while read line; do
echo "Ligne lue: $line"
# fin=${#line}
# myarg=${line:$fin-10:6}
myarg=${line: -10:6}
echo "Argument: $myarg"
echo "Base: $mydate"
if [ "$myarg" '<' "$mydate" ]
then
echo "DEPLACER $line"
else
echo "Date Ok: $myarg"
fi
#done < liste1
done < <(ls Nightly_*)
Dernière modification par pingouinux (Le 28/10/2017, à 06:11)
Hors ligne
#5 Le 28/10/2017, à 08:30
- Watael
Re : [Résolu] Test de 2 chaînes de caractères
j'avais oublié :
pour itérer sur la liste des fichiers d'un répertoire, il est préférable (à cause des espaces, passages à la ligne, et autres caractères invisibles pouvant figurer dans les noms de fichiers), plutôt que ls, d'utiliser une boucle for :
for f in Nightly_*
do
myarg=${f: -10:6}
...
done
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 28/10/2017, à 08:32
- kholo
Re : [Résolu] Test de 2 chaînes de caractères
salut,
if [ $myarg -lt $mydate ]...
doit fonctionner...
et
for line in "/home/tt/Tempo/Nightly_"*
do
...
done
pour dégager les cd, ls, while et read...
mydate=$(date +"%y%m%d")
echo
for line in "/home/tt/Tempo/Nightly_"*
do
echo "Ligne lue: $line"
myarg=${line: -10:6}
echo "Argument: $myarg"
echo "Base: $mydate"
# if [[ $myarg -lt $mydate ]]
if [ $myarg -lt $mydate ]
then
echo "DEPLACER $line"
else
echo "Date Ok: $myarg"
fi
done
je ne maîtrise pas encore les [ ] et [[ ]]...
Rahhh, coiffé par Watael...
je reste le petit scarabée
Dernière modification par kholo (Le 28/10/2017, à 08:33)
Hors ligne
#7 Le 28/10/2017, à 08:51
- Watael
Re : [Résolu] Test de 2 chaînes de caractères
if [ $myarg -lt $mydate ]...
doit fonctionner...
+1
en effet, quand il n'y a que des nombres, il est préférable d'utiliser des opérateurs de comparaison arithmétique.
si tu ne sais pas pourquoi utiliser [[ (fonctions de test avancées), utilise test, ou [*.
*en mettant les variables entre guillemets, qui sont facultatifs entre [[.
Dernière modification par Watael (Le 28/10/2017, à 08:52)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 28/10/2017, à 13:40
- josran
Re : [Résolu] Test de 2 chaînes de caractères
Ah oui !
J'aime beaucoup plus avec toutes ces améliorations; voici la version optimisée et testée avec succès.
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/local/bin
#
mydate=$(date +"%y%m%d")
for line in "/home/tt/Tempo/Nightly_"*
do
echo "Ligne lue: $line"
myarg=${line: -10:6}
echo "Argument: $myarg"
echo "Base: $mydate"
if [ $myarg -lt $mydate ]
then
echo "DEPLACER: $line"
else
echo "Date Ok: $myarg"
fi
done
Merci à tous les contributeurs.
Hors ligne