SH boucle : lecture et copie de fichiers

Fermé
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 - 28 juil. 2008 à 16:31
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 - 30 juil. 2008 à 14:36
Bonjour à tous,

Je fais un script bash executé 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, envoi etc ne me pose pas trop de probleme mais je ne vois pas comment attaquer cette boucle : cat ? read ? sed ?

Merci d'avance pour vos idées.

9 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 juil. 2008 à 18:03
Salut,

> c'est une redirection en écriture
2 c'est le descripteur de fichier pour la sortie d'erreur
/dev/null est un pseudo périphérique spécial vers lequel on peut rediriger un contenu qu'on ne veut pas afficher à l'écran (une sorte de trou noir)

Voici une exemple
lami20j@debian:~$ find /etc -name '*active*'
find: /etc/ssl/private: Permission non accordée
/etc/selinux/refpolicy-targeted/modules/active
find: /etc/selinux/refpolicy-targeted/modules/active: Permission non accordée
find: /etc/selinux/refpolicy-targeted/modules/previous: Permission non accordée

Tu vois bien qu'il y a 3 lines qui ne m'intéressent pas vraiment. Ce sont des messages d'erreurs.
En utilisant une redirection vers /dev/null de ces erreurs donc de la sortie d'errer standard qui est 2 j'obtiens l'affichage sans erreurs
lami20j@debian:~$ find /etc -name '*active*' 2>/dev/null
/etc/selinux/refpolicy-targeted/modules/active


A savoir que tu peux par exemple capturer seulement les erreurs ou afficher le résultat sans erreurs à l'écran et enregistrer les erreurs dans un fichier pour un traitement ultérieur, etc.



1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
28 juil. 2008 à 17:00
Salut,
$ tree
.
|-- liste.txt
|-- repertoire1
|   |-- fichier1.txt
|   |-- fichier2.txt
|   |-- fichier3.txt
|   |-- fichier4.txt
|   |-- fichier5.txt
|   |-- fichier6.txt
|   |-- fichier7.txt
|   |-- fichier8.txt
|   `-- fichier9.txt
`-- repertoire2

2 directories, 10 files

$ cat liste.txt
fichier1.txt
fichier3.txt
fichier5.txt
fichier7.txt
fichier9.txt
fichier18.txt

$ while read line; do mv repertoire1/${line} repertoire2/${line} 2>/dev/null; done < liste.txt

$ tree
.
|-- liste.txt
|-- repertoire1
|   |-- fichier2.txt
|   |-- fichier4.txt
|   |-- fichier6.txt
|   `-- fichier8.txt
`-- repertoire2
    |-- fichier1.txt
    |-- fichier3.txt
    |-- fichier5.txt
    |-- fichier7.txt
    `-- fichier9.txt

2 directories, 10 files

$
;-))
0
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 3
28 juil. 2008 à 17:42
Merci JIPICY ç a m'a l'air très bien,

je test ça tout de suite, pourrais tu m'expliquer ce petit morceau de code stp : 2>/dev/null;

merci
0
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 3
28 juil. 2008 à 18:11
OK, c'est très intéressant.

Effectivement, je ne vois apparaître que les noms de fichiers qui ont réellement été transférées.

Pour ce qui est de la syntaxe de Jipicy, il faut que le fichier de txt qui comprend la liste des fichiers a transférer comprenne une dernière ligne vide sinon le dernier fichier listé n'est transféré.

à moins que j'ai mal intégré la fonction... ;)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
28 juil. 2008 à 18:18
Non ce n'est pas nécessaire, d'ailleurs dans mon exemple (chez moi) le fichier "liste.txt" n'a pas de ligne vide à la fin. Si elle apparait effectivement dans la mise en page, c'est uniquement à des fins de meilleure lisibilité, mais qui j'avoue peut parfois prêter à confusion ;-(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 3
29 juil. 2008 à 11:26
Bonjour,

Un problème apparait lorsque le fichier texte contient une ligne vide. Dans ce cas, le repertoire1 est déplacé dans le repertoire2. Ce problème survient avec toutes les yntaxte que j'ai essayé, aussi je cherche un moyen de supprimer les sauts de ligne dans mon fichier texte, je pense à un cat liste.txt | sed -e /n | sed ''<liste.txt

Bien sur cette syntaxe est incorrecte. :(
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
29 juil. 2008 à 12:11
Essaye ça :
sed '${/^$/d}' liste.txt > nexliste.txt
;-))
0
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 3
29 juil. 2008 à 14:26
merci jipicy, hélas cela ne marche pas, le fichier nexlist.txt généré comprend les mêmes sauts de lignes.

En revanche avec cette syntaxe :

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

cela fonctionne plutot pas mal. Merci pour ton aide, cela m'a donnée bcp d'idées.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
29 juil. 2008 à 15:26
Oups j'avais cru comprendre que tu ne voulais effacer que la dernière ligne si et seulement si cette dernière était vide...

Désolé ;-(
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 juil. 2008 à 15:19
Salut,

perl -pi.orig -e 'print unless /^$/' fichier.txt
ou
egrep -v '^$' fichier.txt >resultat.txt
--
106485010510997108
0
vitcz Messages postés 46 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 8 septembre 2008 3
30 juil. 2008 à 14:36
merci beaucoup, ça tourne impec.
0