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 19/04/2016, à 18:58

Ric_punk

Rechercher des dossiers et les copier dans un autre répertoire

Salut à tous

Je recherche un petit script qui me permettrait de rechercher certains dossiers et de copier ces dossiers dans un autre dossier.
Cette copie ne concernera que certaines extensions de fichiers contenus dans les dossiers

Je m'explique. Je dois remplir une carte sd de dossiers contenant des mp3. Dans les dossiers d'origine il n'y a pas que des mp3 mais aussi d'autres fichiers (en général des images) mais je ne veux récupérer que les mp3 des dossiers que j'ai choisis
Je sais déjà comment rechercher un dossier et copier ce dossier et son contenu dans un autre répertoire. Là où ça se corse pour moi, c'est de rechercher plusieurs dossiers et de ne prendre que les mp3 de ces dossiers
Je vous montre mon petit bout de script concernant le dossier (juste pour savoir si "j'ai bon" au début big_smile

find -type d -name "unfixed - 2012 - punk chaos disorder" -exec cp -Rpt /home/ric/Bureau '{}' +

J'ai déjà la liste complète des dossiers que je dois copier et ils sont tous écrit de la même façon, c'est à dire
groupe - année - titre avec la mention (ep) ou [split] à la fin de quelques dossiers

Je sèche presque totalement
Merci de votre aide ;-)


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#2 Le 19/04/2016, à 19:50

demonipuch

Re : Rechercher des dossiers et les copier dans un autre répertoire

Bonjour

Si tu as déjà la liste des dossiers à copuer pourquoi ne pas utiliser rsync et son option files-from?

Exemple, j'ai 3 dossiers sur mon bureau :

[19:40:20] cedric@HP-CEDRIC:~ $ ls -l /home/cedric/Bureau/
/home/cedric/Bureau/:
total 16
drwxrwxr-x 2 cedric cedric 4096 avril 19 19:37 groupe - année - titre
drwxrwxr-x 2 cedric cedric 4096 avril 19 19:37 groupe - année - titre (ep)
drwxrwxr-x 2 cedric cedric 4096 avril 19 19:38 groupe - année - titre [split]
-rw-rw-r-- 1 cedric cedric   85 avril 19 19:43 liste.txt

Et un fichier avec la liste des dossiers à copier

$ cat /home/cedric/Bureau/liste.txt 
groupe - année - titre
groupe - année - titre (ep)
groupe - année - titre [split]

Avec la commande suivante, je copie les dossiers et leur contenu, en excluant les fichiers .jpg, .jpeg et .png, de /home/cedric/Bureau vers /tmp

$ rsync -razvn --exclude="*.jpg" --exclude="*.jpeg" --exclude="*.png" --files-from=/home/cedric/Bureau/liste.txt /home/cedric/Bureau /tmp
sending incremental file list
groupe - année - titre [split]/
groupe - année - titre [split]/morceau1.mp3
groupe - année - titre [split]/morceau2.mp3
groupe - année - titre [split]/morceau3.mp3
groupe - année - titre/
groupe - année - titre/morceau1.mp3
groupe - année - titre/morceau2.mp3
groupe - année - titre/morceau3.mp3

sent 277 bytes  received 38 bytes  630.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

A noter que l'option -n de rsync lance la commande en mode "test" (sans faire la copie).

Hors ligne

#3 Le 20/04/2016, à 13:12

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Salut
Merci de ta réponse
Je vais tester ça dès que possible mais j'ai oublié de précisé que les dossiers sont dans des sous dossiers.
Je m'explique, si je veux copier un dossier nommé "groupe - année - titre" ce même dossier est déjà dans un dossier portant le nom du groupe, ce qui donne
groupe\groupe - année - titre
groupe1/groupe1 - année - titre
Si je lance la commande

ls -R --group-directories-first

j'obtiens ça

unfixed - 2012 - punk chaos disorder
unfixed - 2013 - battleside
unfixed - 2012 - punk chaos disorder.zip
unfixed - 2013 - battleside.zip

./unfixed - 2012 - punk chaos disorder:
01. fuck uk.mp3
02. disorder.mp3
03. 1 second 2 live.mp3
04. punk girl.mp3
05. black wolf.mp3
06. revenge.mp3
07. everyday is hell.mp3
08. criminal scum.mp3
09. war-charged.mp3
10. no one is free.mp3
11. uk 12.mp3
12. when the last barricade will fall.mp3
cover.jpg
front.jpg

./unfixed - 2013 - battleside:
01. system collapse.mp3
02. nowhere to run.mp3
03. your punk is too dead for me.mp3
04. face to face.mp3
05. maggie.mp3
06. maybe tomorrow.mp3
07. gates of hell.mp3
08. the way i breathe.mp3
09. for the punx.mp3
10. you are not my god.mp3
cover.jpg
front.jpg

Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#4 Le 27/04/2016, à 09:19

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Bon, j'ai déjà trouvé comment faire pour copier uniquement les dossiers de la liste, mais ça copie tout le contenu du dossier, pas uniquement les mp3, mais c'est mieux que rien

while read line; do find /media/ric/Mp3 -type d -name "$line" -exec cp -Rpt "/home/ric/Bureau/copie mp3" '{}' +; done < list_mp3

et si je veux copier les fichiers mais ne pas écraser ceux déjà présents, j'ajoute -n à la commande cp

while read line; do find /media/ric/Mp3 -type d -name "$line" -exec cp -nRpt "/home/ric/Bureau/copie mp3" '{}' +; done < list_mp3

Je n'ai pas encore trouvé pour ne copier que les mp3, mais je cherche, si quelqu'un a une idée je suis preneur big_smile


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#5 Le 27/04/2016, à 09:50

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

Salut,
Le mieux c'est rsync il me semble ; tu peux essayer cette commande :

rsync -a --include=*.mp3 --include=*/ --exclude=* "/chemin/source/" "/chemin/cible/"

Ça copie le contenu de /chemin/source dans /chemin/cible en ne prenant que les mp3 et les sous-répertoires, et ça exclu tout le reste.


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

Hors ligne

#6 Le 27/04/2016, à 10:39

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Salut
Ah ben si c'était si simple lol

Le problème c'est que dans le dossier source j'ai pas mal de dossiers qui ne doivent pas être copiés et qu'avec ta commande ça me copie absolument tout.
J'ai aussi essayé avec le paramètre --files-from= mais il prend la liste comme une liste de fichiers et pas de dossiers et comme je le disais dans mon post précédant les dossiers que je veux copier sont systématiquement contenus dans un dossier portant le nom du groupe du style

groupe/groupe - année - titre de l'album

Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#7 Le 27/04/2016, à 11:06

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

Tu peux rajouter des choses du type « --exclude=dossier1/ » pour exclure tous les répertoires « dossier1 » quelque soit leur emplacement, ou des « --exclude=toto*/ » pour exclure tous les répertoires « toto* » quelque soit leur emplacement ; l'ordre des « --include/--exclude » est important, le résultat peut être totalement différent si on les inverse ; pour des exclusions de dossiers, je dirais qu'il faut mettre comme ça :

rsync -a --exclude=toto*/ --exclude=dossier1/ --include=*/ --include=*.mp3 --exclude=* "/chemin/source/" "/chemin/cible/"

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

Hors ligne

#8 Le 27/04/2016, à 11:24

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Impossible
J'ai déjà 374 dossiers de groupes (et la liste s'allonge régulièrement) et une multitude de dossiers dans ces dossiers, exclure les dossiers un par un ne sert à rien dans mon cas, autant que je les copies "à la main" directement.
Mais je crois que j'ai trouvé la solution

tout d'abord il faut que je crée la liste des dossiers à copier à partir de la liste de départ, et comme ces dossiers sont dans des sous-dossiers avec un find ça marche

while read line; do find /media/ric/Mp3 -type d -name "$line" -exec echo -e >> "/home/ric/Bureau/list_test" '{}' +; done < list_mp3

Cette ligne me permet de créer le fichier avec les chemins complets vers les dossiers
Si ma liste contient par exemple

avskum - 2003 - punkista
cop on fire - 2004 - cop on fire
heyoka - 1996 - demain sera

ça me donne ce résultat

/media/ric/Mp3/heyoka/heyoka - 1996 - demain sera
/media/ric/Mp3/avskum/avskum - 2003 - punkista
/media/ric/Mp3/cop on fire/cop on fire - 2004 - cop on fire
/media/ric/Mp3/heyoka/heyoka - 1996 - demain sera

ensuite je lance cette commande qui va lire le résultat du premier script

while read line; do rsync -av --include=*/ --include=*.mp3 --exclude=* "/$line" "/home/ric/Bureau/copie mp3/"; done < list_test

et si je fais ensuite un tree dans le dossier de destination j'obtiens ça

.
├── avskum - 2003 - punkista
│   ├── 01. fight back capitalism.mp3
│   ├── 02. blod rod.mp3
│   ├── 03. state terrorism.mp3
│   ├── 04. ingen människa är illegal.mp3
│   ├── 05. girigbukar.mp3
│   ├── 06. slå tillbaka.mp3
│   ├── 07. losers union.mp3
│   ├── 08. i hate your fucking war song.mp3
│   ├── 09. svinens sång.mp3
│   ├── 10. the master and slave system.mp3
│   ├── 11. the punk empowerment.mp3
│   ├── 12. united states of war.mp3
│   ├── 13. welcome to the fatland.mp3
│   ├── 14. fight back racism.mp3
│   └── 15. the children of war.mp3
├── cop on fire - 2004 - cop on fire
│   ├── 01. imbecile.mp3
│   ├── 02. asco.mp3
│   ├── 03. medalla de oro.mp3
│   ├── 04. vive la merde.mp3
│   ├── 05. noir.mp3
│   ├── 06. bill gates vete a la mierda.mp3
│   ├── 07. bar de carretera.mp3
│   ├── 08. caos.mp3
│   └── 09. 666 the number of the beast (iron maiden cover).mp3
└── heyoka - 1996 - demain sera
    ├── 01. intro deviance.mp3
    ├── 02. tierra y libertad.mp3
    ├── 03. la bourse ou la vie.mp3
    ├── 04. la mort à deux.mp3
    ├── 05. un heil.mp3
    ├── 06. le bel espoir.mp3
    ├── 07. contingent déserteur.mp3
    ├── 08. cris de colère.mp3
    ├── 09. écran noir.mp3
    ├── 10. entre nous.mp3
    ├── 11. portninwak.mp3
    ├── 12. quartier sauvage.mp3
    ├── 13. couvre feu.mp3
    └── 14. el pueblo unido.mp3

Par contre j'ai toujours un problème avec des dossiers contenant certains caractères comme des [ ( " ' mais ça avance


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#9 Le 27/04/2016, à 13:21

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

À quoi ressemble le fichier list_mp3 ?
Ton arbo d'origine, c'est bien dans le genre /media/ric/Mp3/nom groupe/nom groupe - année - titre album
Les dossiers à exclure peuvent se trouver n'importe où ? Ou sont-ils tous directement sous /media/ric/Mp3 ?


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

Hors ligne

#10 Le 27/04/2016, à 13:55

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

Je pense avoir trouvé une solution qui te convienne :

cd /media/ric/Mp3
for i in */
do
   groupe=${i%/}
   albums=( "$groupe/$groupe - "*/ )
   [[ -d ${albums[0]} ]] || continue
   rsync -a --include='*.mp3' --include='/*/' --exclude='*' "${albums[@]%/}" "/home/ric/Bureau/copie mp3/"
done

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

Hors ligne

#11 Le 27/04/2016, à 15:34

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Ma liste ressemble à ça

acidez - 2014 - w. malignant tumour - nación de metaleros - forajidos del rock 'n' roll [split]
avskum - 2003 - punkista
cop on fire - 2004 - cop on fire
heyoka - 1996 - demain sera

Mais avec plus de 300 lignes et des dossiers qui, comme dans l'exemple, comporte des crochets, des lettres accentuées ou autre. Chaque dossier se trouve dans un dossier nommé comme le nom du groupe, acidez - 2014 - w. malignant tumour - n.... se trouve dans le dossier acidez et ainsi de suite. Par contre toute la musique se trouve dans le disque /media/ric/Mp3
Je teste ta solution et je te tiens au courant.... mais je ne vois pas la liste à prendre dans ton exemple...

Merci en tout cas.

Dernière modification par Ric_punk (Le 27/04/2016, à 15:37)


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#12 Le 27/04/2016, à 16:48

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

Pas besoin de liste !
Tu te places dans le dossier qui contient les répertoires nommés avec seulement le nom du groupe.
Ensuite, par exemple, le script va lancer la synchro que si le dossier « groupe 1 » contient un sous dossier du genre « groupe 1 - 2016 - super titre d'album » ; et seuls les sous-dossiers « groupe 1 - * » seront pris en compte.


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

Hors ligne

#13 Le 27/04/2016, à 20:17

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

J'ai obligatoirement besoin de ma liste puisque dans chaque dossier de groupe il y a souvent plusieurs albums mais je ne les prends pas tous
Pas exemple dans le dossier acidez j'ai tous ces dossiers

acidez - 2006 - en las calles
acidez - 2008 - no hay futuro
acidez - 2010 - w. the angst - deadly dose + dosis mortal [split]
acidez - 2012 - don't ask for permission
acidez - 2014 - beer drinkers survivors
acidez - 2014 - w. malignant tumour - nación de metaleros - forajidos del rock 'n' roll [split]
acidez - 2016 - welcome to the 3d era

mais je ne veux prendre que 4 de ces dossiers, et ça dans pas mal de dossiers.

Je crois que j'ai trouvé la solution mais je rencontre un problème avec les dossiers comprenant des caractères spéciaux comme des '..' ou des [...]


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#14 Le 27/04/2016, à 20:42

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

Ta liste de départ contient exactement les noms d'albums tels qu'ils apparaissent dans l'arborescence ?


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

Hors ligne

#15 Le 27/04/2016, à 22:59

Postmortem

Re : Rechercher des dossiers et les copier dans un autre répertoire

A partir de la liste des albums :

rep_source=/media/ric/Mp3
while read -r album
do
   rsync -a --include='*.mp3' --include='/*/' --exclude='*' "$rep_source/"*"/$album" "/home/ric/Bureau/copie mp3/"
done < liste_albums.txt

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

Hors ligne

#16 Le 29/04/2016, à 10:56

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Whaou !!!!! La grande classe, ça marche impec !!!! Merci beaucoup !!! J'avais eu l'idée avec rsync mais incapable de trouver la bonne formule !!

J'avais trouvé ça

sed -i -e "s/\[/\\\[/g;s/]/\\\]/g" list_mp3
while read -r line; do find /media/ric/Mp3/ -type d -name "$line" -exec echo -e >> /home/ric/Bureau/list_test {} + ; done < list_mp3

while read line; do rsync -av --include=*/ --include=*.mp3 --exclude=* "/$line" "/home/ric/Bureau/copie mp3/"; done < list_test

mais ça faisait un peu trop de code

encore merci de ton aide big_smile:);)


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#17 Le 03/05/2016, à 12:06

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Je ne ferme pas la discussion, je vais chercher maintenant comment faire une interface graphique pour ce script avec choix des dossiers et de la liste....
Pourquoi faire simple quand on peut faire compliqué big_smile


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#18 Le 01/06/2016, à 19:00

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Je recherche avec Zenity pour me faire une petite interface graphique mais je n'ai pas l'impression que Zenity soit capable de faire ce que je cherche, c'est à dire plusieurs choix concernant les dossiers et les fichiers, mais je cherche toujours....


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#19 Le 03/06/2016, à 21:16

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

J'ai fait un petit script graphique pour le choix des répertoires et la liste
Si quelqu'un veut me "corriger"

## sélection du répertoire source ##
rep_src=$(zenity --file-selection --directory --save --title "Sélectionner le répertoire source")
## sélection du répertoire de destination ##
rep_dest=$(zenity --file-selection --directory --save --title "Sélectionner le répertoire de destination")
## sélection de la liste de mp3 ##
list_mp3=$(zenity --file-selection --save --title "Sélectionner la liste de mp3 à copier")
## récapitulatif
recap=$(echo "Répertoire source : $rep_src\n
Répertoire de destination : $rep_dest\n
Liste mp3 : $list_mp3" | zenity --text-info --editable --width 350 --height 200)
## Validation et copie des fichiers dans la carte SD
if [ "$?" -eq 0 ];
then
while read -r album; do rsync -av --include='/*/' --include="*.mp3" --exclude='*' "$rep_src/"*"/$album" "$rep_dest";done < $list_mp3
exit
fi

Dernière modification par Ric_punk (Le 03/06/2016, à 21:22)


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#20 Le 04/06/2016, à 19:25

Ric_punk

Re : Rechercher des dossiers et les copier dans un autre répertoire

Je viens de tester yad (http://www.webupd8.org/2010/12/yad-zeni … splay.html) et je crois que j'ai trouvé ce que je cherchais

Mon script

variables=$(yad --title="Copie de Mp3" --text="" \
--form \
--field="Répertoire source":DIR \
--field="Répertoire de destination":DIR \
--field="Sélection de la liste de Mp3":FL)
rep_src=$(echo $variables | awk 'BEGIN {FS="|" } { print $1 }')
rep_dest=$(echo $variables | awk 'BEGIN {FS="|" } { print $2 }')
list_mp3=$(echo $variables | awk 'BEGIN {FS="|" } { print $3 }')
if [ $? -eq 0 ]
then
while read -r album;
do rsync -av --include='/*/' --include="*.mp3" --exclude='*' "$rep_src/"*"/$album" "$rep_dest";
done < $list_mp3
exit
fi

J'ai bon ??


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne