Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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
lol

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