Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
bash : copie a partir d'une liste
Envoyé par: vitcz

Bonjour à tous,

Je fais un script bash exécuté sur serveur linux :

j'ai un fichier texte : liste.txt et un répertoire /repertoire1 : Mon fichier texte est une liste de noms de fichiers avec un retour à la ligne pour chaque nouveau nom.

J'aimerais faire une boucle qui m'exporte dans un /repertoire2 seulement les fichiers de /repertoire1 cités dans liste.txt.

la suite de mon script : compactage et envoi du repertoire 2 ne me pose pas trop de probleme mais je ne vois pas comment attaquer cette boucle : cat ? read ? sed ?

Il faudra aussi que je fasse une boucle de vérification de présence des fichiers mais je préfère inclure cette vérification à la première.

Merci d'avance pour vos idées.

Poste le Monday 28 July 2008 17:03:08
Répondre     Citer    
Re: bash : copie à partir d'une liste
Envoyé par: nicola

Avec ls puis grep derrière un tube ?

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Monday 28 July 2008 17:20:16
Répondre     Citer    
Re: bash : copie à partir d'une liste

Ou peut-être
for f in $(cat liste.txt); do
ça ne marche que si liste.txt n'est pas trop gros (moins de 100Ko).

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 28 July 2008 17:23:19
Répondre     Citer    
Re: bash : copie à partir d'une liste
Envoyé par: vitcz



Citation
nicola
Avec ls puis grep derrière un tube ?


tu veux dire ls | grep ^(char)

Cela me liste les fichiers textes selon les critere du grep, mais je ne les connais pas d'avance les noms de fichiers listés dans le .txt.

je pense plus à un

#! /bin/bash
#debut du script
cat maliste
while read line; do mv rep1/$line rep2/$line ;done

#fin du script

mais ca ne marche pas en l'état

Poste le Monday 28 July 2008 17:27:01
Répondre     Citer    
Re: bash : copie à partir d'une liste

Peut-être (pas testé!)
#! /bin/bash
grep -v '^#' maliste | while read line; do mv rep1/$line rep2/$line ;done
j'ai mis un grep pour permettre les commentaires # dans le fichier maliste.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 28 July 2008 17:32:50
Répondre     Citer    
Re: bash : copie à partir d'une liste

ah !? un UUOC* de la part de Basile !?

Il faut préférer
for i in $(<liste); do 
mv $i répertoire2/.
done
Il ne faut pas oublier de préciser les chemins vers les fichiers de la liste et vers répertoire2...

*[v]Useless Use Of Cat[/v]

Poste le Monday 28 July 2008 18:49:05
Répondre     Citer    
Re: bash : copie à partir d'une liste

Citation
Ivan
ah !? un UUOC* de la part de Basile !?
*Useless Use Of Cat

Hélas oui. Et ceci parce que si jz lis bien le <liste je ne l'ai jamais écrit et donc je n'y pense jamais.

Alors je présente toutes mes excuses aux lecteurs pour ce UUOC, et merci à Ivan (j'ai vraiment la flemme de taper son prénom en lettres cyrilliques, qu'il m'en excuse!) pour la correction.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 28 July 2008 19:08:49
Répondre     Citer    
Re: bash : copie à partir d'une liste
Envoyé par: AlSim

Citation
Basile STARYNKEVITCH
Alors je présente toutes mes excuses aux lecteurs
pour ce UUOC, et merci à Ivan (j'ai vraiment la
flemme de taper son prénom en lettres cyrilliques,
qu'il m'en excuse!) pour la correction.
Copier-coller ? :ange:

[catwell.info]

Poste le Monday 28 July 2008 23:43:10
Répondre     Citer    
Re: bash : copie à partir d'une liste

Citation
AlSim
Copier-coller ?

Il me semble que ça ne marche pas pour la balise
Citation



[color=red

----[/color]

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Tuesday 29 July 2008 07:30:21
Répondre     Citer    
Re: bash : copie a partir d'une liste
Envoyé par: vitcz

Bonjour et merci à tous pour votre aide précieuse,

J'ai pris le temps de tester toutes vos syntaxes et de les décliner un peu pour voir les resultats:

Citation
&#1048;&#1074;&#1072;&#1085;
for i in $(<liste); do
mv $i répertoire2/.
done

J'ai essayé plusieurs manières de pointer les répertoires concernés : a chaque fois le repertorie1 est déplacé dans le repertoire2. J'ai l'impression qu'il manque la notion de ligne.


Citation
Basile STARYNKEVITCH
#! /bin/bash
grep -v '^#' maliste | while read line; do mv rep1/$line rep2/$line ;done

Marche bien. Mais pour toutes les syntaxes testée, un problème apparait : si le fichier liste.txt contient une ligne vide : le répertoire1 est déplacé dans le répertoire2....

D'ou m'a nouvelle question : comment nettoyer le fichier texte :

Alors j'essay sans trop de résultat :

cat liste.txt | sed -e \b | sed '' > liste.txt

mais je pense que cela à plutôt a voir avec la commande : col [-bfx] [-l num]
que je n'arrive pas à argumenter.

Poste le Tuesday 29 July 2008 11:15:56
Répondre     Citer    
Re: bash : copie a partir d'une liste

Peut-être remplacer le grep -v '^#' par
egrep -v '^(#| *$)'
(pas testé et pas sûr que ça marche).

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Tuesday 29 July 2008 12:55:23
Répondre     Citer    
Re: bash : copie a partir d'une liste
Envoyé par: vitcz

Basile :

egrep -v '^(#| *$)' maliste | while read line; do mv rep1/$line rep2/$line ;done

Fonctionne très bien, vous êtes un chef.

Merci beaucoup.

Poste le Tuesday 29 July 2008 14:36:08
Répondre     Citer    
Re: bash : copie a partir d'une liste

Bonjour vitcz


Mais, pourquoi ton fichier liste.txt contiendrait-il des lignes vides ? Tu n'a pas dit comment tu le remplis. A la main, ou avec une (ligne de) commande(s) ?

ls -F | egrep -v "(/$|\*$)" > liste.txt # egrep filtre les répertoires et les fichiers exécutables 
J'ai inséré des lignes vides dans liste.txt, et commenté quelques lignes.
for i in $(egrep -v "^#" liste.txt); do mv /home/nbah/$i /home/nbah/cpfiles/.; done
mv: ne peut évaluer `nouveau': Aucun fichier ou répertoire de ce type
mv: ne peut évaluer `fichier': Aucun fichier ou répertoire de ce type
J'ai effectivement un fichier 'nouveau fichier', qui n'est pas déplacé (?). Mais les lignes vides sont ignorées, ainsi que les lignes commentées.

Poste le Tuesday 29 July 2008 15:37:06
Répondre     Citer    
Re: bash : copie a partir d'une liste

Peut-être
egrep -v '^(#| *$)' maliste | while read line; do if [ -f "rep1/$line" ]; then mv "rep1/$line" "rep2/$line" ; fi; done

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Tuesday 29 July 2008 16:13:07
Répondre     Citer    
Re: bash : copie a partir d'une liste

Oui !

et on peut éventuellement encore "simplifier" un petit peu :
egrep -v '^(#| *$)' maliste | while read line; do [ -f "rep1/$line" ] && mv "rep1/$line" "rep2/$line" ; done

Poste le Tuesday 29 July 2008 16:51:23
Répondre     Citer    
Re: bash : copie a partir d'une liste
Envoyé par: vitcz

Citation
&#1048;&#1074;&#1072;&#1085;
Bonjour vitcz


Mais, pourquoi ton fichier liste.txt
contiendrait-il des lignes vides ? Tu n'a pas dit
comment tu le remplis. A la main, ou avec une
(ligne de) commande(s) ?

Au départ, les utilisateurs sont supposés le remplir a la main, d'ou ma recherche d'erreures possibles.
Mais je me demande s'il n'est pas préférable de mettre en place une interface d'édition de ce fichier texte.

Citation
YVAN
/home/nbah/$i /home/nbah/cpfiles/
Si j'ai bien compris, ces adresse sont a remplacer par celle de mes rep1 et rep2, mais là le Rep 2 est dans rep1 non ?


Citation
Basile STARYNKEVITCH
egrep -v '^(#| *$)' maliste | while read line; do if [ -f "rep1/$line" ]; then mv "rep1/$line" "rep2/$line" ; fi; done

La dernière ligne de code fonctionnait déjà pas mal, j'essaie celle ci et te dis la différence.

Poste le Tuesday 29 July 2008 17:20:31
Répondre     Citer    
Re: bash : copie a partir d'une liste

Tu mets le rep2 où tu veux, voire dans une partition dédiée à la conservation des sauvegardes.

De toutes façons, utilise plutôt la ligne de Basile, qui, elle, prend en compte les fichiers contenant des espaces, et teste l'existence des fichiers listés.

Poste le Tuesday 29 July 2008 19:30:28
Répondre     Citer    
Re: bash : copie a partir d'une liste
Envoyé par: vitcz

Je suis limité au repertoirs sous-jacents à celui sur lequel je travail sur ce serveur, je reste sur la dernière version de Basile qui tourne très bien, Mais merci beaucoup pour ta contribution, j'ai appris 2, 3 trucs.
A bientôt.

Poste le Wednesday 30 July 2008 11:32:25
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
bash : copie a partir d'une liste
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons