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 15/11/2013, à 10:50

snipe2004

Copie de fichiers dans certains dossiers

Bonjour à tous,

J'ai une série de dossiers dont le nom est composé de six lettres.
Parmi ceux-ci, il y en a un certain nombre dans lesquels je voudrais copier certains fichiers.
J'ai un .txt dans lequel, à chaque ligne, se trouve le nom d'un des dossiers devant recevoir les fichiers.
J'aimerais faire un script/une commande pour qu'il me copie uniquement là-dedans.

J'ai été initié à "find" il n'y a pas longtemps grâce à ce forum, donc j'essaie avec, mais je ne trouve pas comment lui faire lire chaque ligne d'un fichier texte pour ensuite rechercher les dossiers qui portent ce nom...

Ou alors, écrire un petit script du style ./copie.sh fichierliste.txt qui irait rechercher dans le fichier texte les lignes en question?

Merci de vos éclaircissements :-)


ACER NITRO V 515-54-75T7
i7-9750H @ 2,6 GHz x 12 + GTX 1660 Ti/PCIe/SSE2 6 Go (GDDR6)
NVMe 1 Tb, IPS 144 Hz

Hors ligne

#2 Le 15/11/2013, à 11:11

pires57

Re : Copie de fichiers dans certains dossiers

il y en a un certain nombre dans lesquels je voudrais copier certains fichiers

Pas clair, comment sommes-nous censés savoir dans quel dossier doit-être envoyé tel ou tel autre fichier?


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#3 Le 15/11/2013, à 11:15

snipe2004

Re : Copie de fichiers dans certains dossiers

Je suis parti vers un bash :

#!/bin/bash

read -p 'Entrez le répertoire des fichiers à copier vers les sessions profs :' repertoire
if [ -d $repertoire ]
	then read -p "Vous allez copier les fichiers suivants vers les sessions profs : \n ls $repertoire \n Confirmez-vous votre action [o/n] ?" accord
		if [ $accord="o" ]
			then cp -Rf $repertoire /profs
			else echo "Processus arrêté à votre demande."
		fi
	else echo "Le répertoire indiqué n'existe pas."
fi

Et là-dedans, je dois remplacer "/profs" par chacun des répertoires à six lettres extraits d'un fichier txt... Et là, je bloque sad


ACER NITRO V 515-54-75T7
i7-9750H @ 2,6 GHz x 12 + GTX 1660 Ti/PCIe/SSE2 6 Go (GDDR6)
NVMe 1 Tb, IPS 144 Hz

Hors ligne

#4 Le 15/11/2013, à 11:19

snipe2004

Re : Copie de fichiers dans certains dossiers

Oups, je réponds à Pires57 ici :
J'ai 1630 dossiers utilisateurs, nommés par exemple /usersdata/PIRERO (pour l'utilisateur Pires Robert ;-) ).
Parmi ceux-ci, il y en a deux cents qui sont ceux de profs. Mon seul moyen de savoir si un dossier est un dossier prof, c'est de comparer avec un fichier texte dans lequel ils sont tous recensés, eux et uniquement eux.
Et j'ai donc des fichiers dans un répertoire /home/usr/Documents/FichiersATransférer que je veux envoyer uniquement vers les dossiers présents dans mon fichier .txt.

EDIT : je suis pas clair -_-'
Je me re-résume :
J'ai des fichiers 1, 2, 3 et 4 stockés dans un répertoire "ATransferer".
Je veux les envoyer vers les dossiers /reseau/usersdata/[xxxxxx]/Desktop
Où [xxxxxx] correspond à des lignes de six lettres qui se trouve dans un fichier txt.
J'espère être plus clair xD

Dernière modification par snipe2004 (Le 15/11/2013, à 11:24)


ACER NITRO V 515-54-75T7
i7-9750H @ 2,6 GHz x 12 + GTX 1660 Ti/PCIe/SSE2 6 Go (GDDR6)
NVMe 1 Tb, IPS 144 Hz

Hors ligne

#5 Le 15/11/2013, à 11:35

Postmortem

Re : Copie de fichiers dans certains dossiers

Salut,

while read rep_prof
do
   echo cp -Rp "/ATransferer/." "/reseau/usersdata/$rep_prof/Desktop"
done < liste.txt

Cela va copier le contenu de /ATransferer dans chacun des répertoires.
Il faut enlever le "echo" si ça te semble OK.

Edit : si tu veux copier le répertoire /ATransferer et non pas seulement son contenu, il faut remplacer :

cp -Rp "/ATransferer/." "/reseau/usersdata/$rep_prof/Desktop"

Par :

cp -Rp "/ATransferer" "/reseau/usersdata/$rep_prof/Desktop"

Dernière modification par Postmortem (Le 15/11/2013, à 11:37)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 15/11/2013, à 11:44

snipe2004

Re : Copie de fichiers dans certains dossiers

HEllo et merci, Postmortem!

Je vais essayer ça tout de suite :-)
Quelques questions pour bien piger ce qui se passe :
cp -Rp --> pourquoi p ?
Je ne comprends pas la structure : comment le script pige-t-il qu'il doit lire liste.txt ? C'est bizarre de mettre ça après le done, non ?

Désolé de mes bêtes questions hmm


ACER NITRO V 515-54-75T7
i7-9750H @ 2,6 GHz x 12 + GTX 1660 Ti/PCIe/SSE2 6 Go (GDDR6)
NVMe 1 Tb, IPS 144 Hz

Hors ligne

#7 Le 15/11/2013, à 11:53

Postmortem

Re : Copie de fichiers dans certains dossiers

snipe2004 a écrit :

cp -Rp --> pourquoi p ?

Le 'p' permet de garder les droits/heures des fichiers d'origines ; euh... je sais pas pourquoi je l'ai mis ! Sans doute l'habitude !

snipe2004 a écrit :

Je ne comprends pas la structure : comment le script pige-t-il qu'il doit lire liste.txt ? C'est bizarre de mettre ça après le done, non ?

Le fait de mettre "< liste.txt" après "done" fait que le fichier liste.txt devient l'entrée standard pour toute la boucle. Ainsi, "read" va lire dans le fichier plutôt que d'attendre une réponse saisie au clavier.
Par contre, si tu veux utiliser un "read" dans la boucle pour lire la réponse à une question comme tu l'as fait dans le script que tu as donné plus haut, il faudra ruser. Car avec ma construction, cela irait chercher la réponse dans le fichier liste.txt.

Ajout :
Si tu utilises un read en plus dans la boucle, voilà ce que cela ferait :

$ cat liste.txt
ABCDEF
GHIJKL
MNOPQR

$ while read rep_prof
> do
>    echo cp -Rp "/ATransferer/." "/reseau/usersdata/$rep_prof/Desktop"
>    read -p "Voulez-vous effectuer cette commande ? " reponse
>    echo "Vous avez répondu : $reponse"
>    echo ==========
> done < liste.txt
cp -Rp /ATransferer/. /reseau/usersdata/ABCDEF/Desktop
Vous avez répondu : GHIJKL
==========
cp -Rp /ATransferer/. /reseau/usersdata/MNOPQR/Desktop
Vous avez répondu :
==========

On peut contourner en faisant ainsi :

$ exec 3<&0
$ while read rep_prof
> do
>    echo cp -Rp "/ATransferer/." "/reseau/usersdata/$rep_prof/Desktop"
>    read -u 3 -p "Voulez-vous effectuer cette commande ? " reponse
>    echo "Vous avez répondu : $reponse"
>    echo ==========
> done < liste.txt
cp -Rp /ATransferer/. /reseau/usersdata/ABCDEF/Desktop
Voulez-vous effectuer cette commande ? oui
Vous avez répondu : oui
==========
cp -Rp /ATransferer/. /reseau/usersdata/GHIJKL/Desktop
Voulez-vous effectuer cette commande ? non
Vous avez répondu : non
==========
cp -Rp /ATransferer/. /reseau/usersdata/MNOPQR/Desktop
Voulez-vous effectuer cette commande ? peut-etre
Vous avez répondu : peut-etre
==========

Dernière modification par Postmortem (Le 15/11/2013, à 12:11)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne