Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 10h19   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 4
Points : 4
Par défaut script d'archivage d'une liste de fichiers

Bonjour,

Je souhaite automatiser l'archivage de fichiers dans un script.
(par exemple, lister tous mes fichiers de 2008, les déplacer dans un répertoire 2008 pour pouvoir lez zipper)

Par exemple quand je lance directement : ls -lrt *2008*
-bash: /bin/ls: Argument list too long

Je n'arrive pas à affecter cette commande ls à une variable dans mon script, qqchose du style :
X=ls -lrt *2008*
mv X ./2008 où X serait ma liste de fichiers...

Quelqu'un aurait-il une idée svp?
nathan29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/09/2011, 14h00   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
tries les par durée de vie au lieu de les trier par nom...ca permet de faire fichier par fichier et de ne pas avoir d'arg list too long...

par exemple
Code :
1
2
find /home -type f -mtime +700 -exec tar uvf /dev/rmt0 {} \; 
find /home -type f -mtime +700 -exec rm-f {} \;
dans cet exemple j'ajoute tout fichier de + de 700 jours d'age à mon archive. puis je les supprimes du disque...
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 20h41   #3
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par nathan29 Voir le message
Bonjour,

Je souhaite automatiser l'archivage de fichiers dans un script.
(par exemple, lister tous mes fichiers de 2008, les déplacer dans un répertoire 2008 pour pouvoir lez zipper)

Par exemple quand je lance directement : ls -lrt *2008*
-bash: /bin/ls: Argument list too long
Salut

J'ai rarement vu un ls échouer parce qu'il y a trop de fichiers...???
Toutefois, il y a une différence entre ton besoin exprimé (lister tous les fichiers de 2008) et ton traitement (qui est de lister tous les fichiers ayant 2008 dans leur nom). Ce n'est pas parce qu'ils ont 2008 dans leur nom qu'ils sont forcément de 2008...

Citation:
Envoyé par nathan29 Voir le message
Je n'arrive pas à affecter cette commande ls à une variable dans mon script, qqchose du style :
X=ls -lrt *2008*
Faut utiliser les backquottes style var=`commande`Le shell exécute la commande et reclaque tout ce qu'elle affiche à l'endroit des backquottes. Donc dans l'exemple ça le met dans la variable "var"

Citation:
Envoyé par nathan29 Voir le message
mv X ./2008 où X serait ma liste de fichiers...
Déjà faut pas mettre ls -l car tu auras aussi les attributs des fichiers dans X. Ensuite, ce serait plus juste de mettre mv $X car c'est la norme quand on veut accéder au contenu des variables.

Maintenant, il faut aussi savoir que le shell est limité et que souvent tu ne peux pas tout faire en une commande magique. C'est pour ça qu'il existe les boucles de traitement de flux.

Le principe est le suivant: tu envoies le flux dans un | while read line; do...done. Le read se calant sur le <return>, chaque ligne ne contiendra qu'une ligne venue du flux. Et la boucle while traitera toutes les lignes.

Donc une des possibilités pourrait être de faire
Code bash :
1
2
3
4
ls -rt *2008* |while read fic
do
    mv "$fic" 2008
done

Tu peux aussi utiliser le find qui possède tout un tas d'options de recherche plus une option -exec permettant de faire traiter chaque élément trouvé par find par la commande de ton choix
Code bash :
find . -name "*2008*" -type f -exec mv {} 2008 \;
Ici, chaque fichier (symbolisé par les accolades) sera traité via mv
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 10h16   #4
Invité de passage
 
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 4
Points : 4
Merci pour vos réponses, je vais essayer de suite...
nathan29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h49.


 
 
 
 
Partenaires

Hébergement Web