Bonjour,
Je cherche à écrire un shell qui vérifie l'existence d'un ou plusieurs fichiers (par ex "t*.txt"), et qui , si le ou les fichiers existent les déplace dans un répertoire old; s'ils n'existent pas, le programme sort avec un code de retour 1.
J'ai essayé:
toto="t*.txt*"
if [ -z "$toto" ] ; then
exit 1
else
mv $toto old/"
fi
exit 0
mais cela ne marche que dans le cas ou les fichiers existent déjà.
Merci de votre aide.
# erreur dans ton test
Posté par khan . Évalué à 2.
True if the length of string is zero.
Or la tu veux verifier l'existence d'un fichier, donc
-e file
True if file exists.
regarde l'aide de ton shell sur le sujet.
K.
[^] # Re: erreur dans ton test
Posté par green . Évalué à 1.
J'ai essayé ceci:
#!/bin/bash
toto="t*.txt*"
if [ ! -e "$toto" ]
then
exit 1
else
mv $toto old/
fi
exit 0
Cette fois ci mon script ne renvoie pas d'erreur lors de l'inexistence des fichiers, mais ne les déplace pas.
si quelqu'un peut m'aider, merci par avance.
[^] # Re: erreur dans ton test
Posté par green . Évalué à 1.
J'ai essayé
if [ ! -e "$toto" ] à la place de if [ -z "$toto" ] .
le script ne renvoie plus d'erreur dans le cas ou les fichiers sont absents mais ne deplace plus les fichiers.
si quelqu'un a une idée, par avance merci.
[^] # Re: erreur dans ton test
Posté par khan . Évalué à 1.
Ton script doit bien te dire la raison du non deplacement ?
Tu lances le script par Cron ?
Car sinon syntaciquement cela me semble correct (j'ai po tester par contre). Regarde les autres tests possible sur les fichiers, il me semble qu'il y en a un qui verifie si tu as des droits dessus. Au pire un bon vieux ET :)
K.
[^] # Re: erreur dans ton test
Posté par khan . Évalué à 2.
toto="t*.txt*"
Ne peut pas fonctionner ! Il faut faire une boucle sur les fichiers à la place.
Soit tu donne 1 seul nom de fichier et dans ce cas, tu peux tester si il existe, soit tu fais une boucle de recherche :
for i in `ls $toto`
do
mv $i ....
done
En plus tu pourras mettre un petit affichage des fichiers deplacés.
Je te conseille quand meme fortement de prendre un manuel du shell (tiens d'ailleurs tu utilises lequel ?).
Pi les moteurs de recherche sont tes amis aussi :)
K.
# Revoir problématique
Posté par Obsidian . Évalué à 4.
C'est dans le concept même que quelque chose cloche, et c'est pourquoi tu n'arriveras jamais à pondre ton algo.
" * " peut être substitué par un nombre indéfini de caractères, donc il est évident que le shell va développer cela en une liste des fichiers existants qui dont le nom valide le motif. S'il s'agissait de développer en toutes les combinaisons possibles, tu en obtiendrais une infinité !
Par contre, tu peux les développer dans un répertoire donné et vérifier s'ils existent tous dans un autre. Dans ce cas, le développement de toto="t*.txt*", effectué à la bonne place, fonctionnera. Mais pour le reste, tu n'as pas besoin d'une boucle : " mv " peut naturellement recevoir plus de deux arguments, auquel cas le dernier doit être un répertoire :
mv fichier1 fichier2 fichier3 monrepertoire/
Et si un des fichiers est inexistant, c'est la commande mv elle-même qui échouera et renverra ton code 1.
[^] # Re: Revoir problématique
Posté par Damien Pobel (site web personnel) . Évalué à 1.
find . -name t\*.txt -exec mv {} old/ \;
https://damien.pobel.fr
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.