Faust Posté(e) le 18 janvier 2004 Partager Posté(e) le 18 janvier 2004 j'arrive pas à voir ce qui marche pas la dedans... Le but est de prendre tout les fichiers dans le sous répertoire et les mettre dans le répertoire parent... QQ'un peut m'enligner un peu? #!/bin/bash echo Quel dossier voulez vous nettoyer? read folder for folder in `find -type d`; do for fichier in $folder/*; do if [ -f $fichier ]; then mv $fichier $folder else echo blabla fi done done Lien vers le commentaire Partager sur d’autres sites More sharing options...
gauret Posté(e) le 18 janvier 2004 Partager Posté(e) le 18 janvier 2004 #!/bin/bashecho Quel dossier voulez vous nettoyer? read folder for folder in `find -type d`; do Et hop tu viens d'écraser ta variable "folder"... for fichier in $folder/*; do if [ -f $fichier ]; then mv $fichier $folder else echo blabla fi done done J'ai pas trop compris ce que tu veux faire, mais je te propose ça : Si tu veux déplacer récursivement tous les fichiers d'un dossier A dans un dossier B : find dossier_A -type f -exec mv {} dossier_B \; Et c'est tout. C'était bien ça ? A+ Gauret Lien vers le commentaire Partager sur d’autres sites More sharing options...
Angel Eyes Posté(e) le 18 janvier 2004 Partager Posté(e) le 18 janvier 2004 #!/bin/bashecho Quel dossier voulez vous nettoyer? read folder for folder in `find -type d`; do Et hop tu viens d'écraser ta variable "folder"... for fichier in $folder/*; do if [ -f $fichier ]; then mv $fichier $folder else echo blabla fi done done J'ai pas trop compris ce que tu veux faire, mais je te propose ça : Si tu veux déplacer récursivement tous les fichiers d'un dossier A dans un dossier B : find dossier_A -type f -exec mv {} dossier_B \; Et c'est tout. C'était bien ça ? A+ Gauret mv dossier_A dossier_B, c'est pas plus simple ?? Lien vers le commentaire Partager sur d’autres sites More sharing options...
gauret Posté(e) le 19 janvier 2004 Partager Posté(e) le 19 janvier 2004 mv dossier_A dossier_B, c'est pas plus simple ?? Nope, parce qu'un simple mv dossier_A dossier_B ça conserve les sous répertoires de A. Si j'ai bien compris, il veut "mettre à plat" le dossier : tous les fichiers de dossier_A et de tous ses sous-répertoires doivent se retrouver directement à la racine de dossier_B. Mais c'est peut-être pas ça que cherche à faire Faust en fait. Non ? A+ Gauret Lien vers le commentaire Partager sur d’autres sites More sharing options...
Angel Eyes Posté(e) le 19 janvier 2004 Partager Posté(e) le 19 janvier 2004 c'est très bizarre comme manipulation... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sandeman Posté(e) le 20 janvier 2004 Partager Posté(e) le 20 janvier 2004 Nanan, la commande find c'est le couteau suisse du bricolage dans les arborescences de fichiers. Du bonheur avec un \; à la fin ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Faust Posté(e) le 20 janvier 2004 Auteur Partager Posté(e) le 20 janvier 2004 dur de savoir si on a des réponses...le forum m'envoit rien dans mon courriel... bon, la manip peut sembler étrange, c'est pour un travail pratique. J'en connais pas beaucoup sur Linux, et encore moins sur les scripts, mais bon, à force de lire et de lire j'en suis arrivé à ce que j'ai écrit plus haut... à force d'essayer j'ai aussi boussiller ma machine, mais ca c'est autre chose... le vrai problème c'est : "Faire un script en Shell du nom de cleandir avec un nombre variable de paramètres qui sont des répertoires existants dans le répertoire courant. Pour chacun des répertoires nommés, le script doit déplacer tous ses fichiers au répertoire courant. Si les noms des fichiers sont identiques, le script doit concatener les fichiers sous un même nom dans le répertoire courant. Quand les répertoires nommés sont vides, ils doivent être détruits." Alors j'imagine qu,avec find dossier_A -type f -exec mv {} dossier_B \; , je devrais rajouter un " if fichier du dossier_A=fichier du dossier_B cat fichier_A >> fichier_B et if folder_A est vide rm -f" Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 20 janvier 2004 Partager Posté(e) le 20 janvier 2004 La commande find: find repertoire de départ [critères] [options de commande] La commande find permet de rechercher un fichier dans l arborescence à partir du répertoire spécifié, et ce de manière récursive. Si aucune indication n'est faite, la commande find cherche tous les fichiers. Il est cependant possible de mentionner des options de recherche pour limiter celle-ci. Si cette commande a trouvé un fichier correspondant au critère, il est traité par les options de commande. Si aucune option n'est mentionnée, il ne se passe rien. Comme option de commande, vous pouvez utiliser -print, -exec et -ok. Voici quelques options de choix utilisables pour limiter la recherche: -name fichier recherche par nom de fichier (metacaractères autorisés) -type type recherche par type de caractère -user nom recherche par propriétaire -perm droits recherche par droits d acces Voilà j espere que mon explication de la commande find est claire Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sandeman Posté(e) le 20 janvier 2004 Partager Posté(e) le 20 janvier 2004 dans le cas de ton TP, alors, plutôt qu'un mv tu fais un bête cat /repsource/fichier >> /fichier (si le fichier existe, concat, sinon, create :) kekvous pensez de ça ? #!/bin/sh # tant que le premier paramètre n'est pas vide while [ -n $1 ] do # je recupère tous les fichiers du répertoire (bon OK tous les fichiers avec des noms "normaux") list=`ls $1` for i in $list do # je concatène vers le repertoire local, nom de fichier courant (merci basename) cat $i >> `basename $i` # en option, je vire le fichier copié rm $i done # je décale mes arguments de 1 ( $2 devient $1, etc. plus élégant qu'un for dans $#) # on pourrait faire + élegant et - lisble avec une condition sur le code retour de shift :) shift 1 done Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.