Déplacer dossiers et sous-dossiers, mais pas les fichiers

Ceci devrait fonctionner. Cela recherchera tous les fichiers présents dans ton dde dans le répertoire "Musique_ok".
Ensuite, il se sert des noms des dossiers pour le rajouter dans le nom du fichier. Il traitera tous les fichiers sauf les ".DS_Store"

Cas 1
"./artiste/album/fichier" deviendra "artiste - album - fichier"

Cas 2
"./dossier/fichier" deviendra "dossier - fichier"

Et à la fin, je t'ai fait une petite détection des fichiers qui semblent être des doublons.
Tu auras 3 fichiers txt créés avant le répertoire Musique_ok:
  1. liste_musique.txt : la liste de tous les fichiers trouvés dans "Musique_ok" et qui seront donc renommés
  2. liste_musique_doublon_1.txt : le résultat des cksum de ces fichiers (est fait après leur déplacement)
  3. liste_musique_doublon_2.txt : les fichiers dont le cksum est identique

Bloc de code:
#!/bin/bash

dde="/Volumes/TOSHIBA"
source="${dde}/Musique_ok"
liste_fic="${dde}/liste_musique.txt"
liste_fic_sort1="${dde}/liste_musique_doublon_1.txt"
liste_fic_sort2="${dde}/liste_musique_doublon_2.txt"

if [ ! -d "${source}" ] ; then echo error ; exit 1 ; fi
cd "${source}"

find . -type f | grep -v ".DS_Store" | head 10 > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  cp "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"

#detection doublon
#936731427 13791 listemusique.txt
#936731427 13791 test.txt
cksum "${source}/*.*" | sort > "${liste_fic_sort1}"
cut -d' ' -f 1,2 "${liste_fic_sort1}" | uniq -d | while IFS= read -r fichier_cksum
do
  egrep "^${fichier_cksum} " "${liste_fic_sort1}"
  echo ""
done > "${liste_fic_sort2}"

La partie
Bloc de code:
find . -type f | grep -v ".DS_Store" | head 10 > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  cp "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"
est à remplacer par
Bloc de code:
find . -type f | grep -v ".DS_Store" > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  mv "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"
une fois que c'est lancé une première fois sans erreur et que tu as vérifié que le résultat te convient bien.
La version de base ne traitera que 10 fichiers et en fera une copie. Après la modification, cela traitera bien tous les fichiers et les déplacera (pas de copie)
 
Oups! C'est le nouveau code pour le "musique.sh"

Suis la procédure que j'avais mis ici pour le mettre à jour :

Remplace le contenu de l'ancien fichier "musique.sh" par le code ci-dessous

Ensuite, tu peux le lancer dans le terminal via la commande
Bloc de code:
./musique.sh
 
J'ai remplacé dans TextEdit le bloc de code donné ci-dessus, sous musique.sh, puis lancé dans le Terminal le
find . -type f | grep -v ".DS_Store" | head 10 > "${liste_fic}"

Capture d’écran 2020-09-30 à 12.35.27.png

Qu'est-ce que je loupe ?
 
Dernière édition par un modérateur:
Ferme ce terminal et ouvre en un nouveau. Comme ça on n'a plus l'ancien affichage qui gène et autre et tu seras normalement au bon endroit. Il te suffira alors de lancer le script via le
Bloc de code:
./musique.sh
 
Ça ne marche pas...
Je ne comprends pas… J'ai essayé TextEdit avec musique.sh, j'ai recommencé sur liste musique_fichier.txt

J'ai essayé des trucs sur le Terminal…
Je t'envoie capture d'écran :

Capture d’écran 2020-10-01 à 10.40.25.png
 
Dernière édition par un modérateur:
Le fichier musique.sh de ton répertoire utilisateur est bien modifié ?
Pour le lancer, n’oublie pas de taper son nom avec le point au tout début
 
Je crois que je m'y perds… je te prie de m'excuser

Sur TextEdit : j'ai le répertoire musique.sh où j'ai rentré le gros script envoyé y'a 2 jours. Puis sur le Terminal j'ai entré : le find ce qui n' a rien donné. J'ai entré le ./musique.sh et ça me met : permission denied
 
Dernière édition par un modérateur:
bon… et bien je ne sais pas...

j'ai bien modifié le fichier musique.sh de mon répertoire utilisateur .
j'ai lancé dans le terminal ./musique.sh et ça me met permission denied..
 

Fichiers joints

  • Capture d’écran 2020-10-01 à 13.20.12.png
    Capture d’écran 2020-10-01 à 13.20.12.png
    419,2 KB · Affichages: 216
On va reprendre un de mes anciens postes et le mettre à jour (de retour sur mon mac, c'est plus simple pour ça) ;)

Donc ouvre TextEdit, colle le code ci-dessous dedans et enregistre ça comme fichier nommé "musique.sh" dans ton répertoire de base (celui avec ton nom de user). A priori seule cette partie est ok
Bloc de code:
#!/bin/bash

dde="/Volumes/TOSHIBA"
source="${dde}/Musique_ok"
liste_fic="${dde}/liste_musique.txt"
liste_fic_sort1="${dde}/liste_musique_doublon_1.txt"
liste_fic_sort2="${dde}/liste_musique_doublon_2.txt"

if [ ! -d "${source}" ] ; then echo error ; exit 1 ; fi
cd "${source}"

find . -type f | grep -v ".DS_Store" | head 10 > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  cp "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"

#detection doublon
#936731427 13791 listemusique.txt
#936731427 13791 test.txt
cksum "${source}/*.*" | sort > "${liste_fic_sort1}"
cut -d' ' -f 1,2 "${liste_fic_sort1}" | uniq -d | while IFS= read -r fichier_cksum
do
  egrep "^${fichier_cksum} " "${liste_fic_sort1}"
  echo ""
done > "${liste_fic_sort2}"

Ensuite, lance le Terminal. Il t'affichera le répertoire de ton user par défaut.
Passe alors la commande suivante pour rendre ce script exécutable.
Bloc de code:
chmod +x musique.sh

Il ne restera plus qu'à le lancer via la commande. Relance un terminal pour être au bon endroit
Bloc de code:
./musique.sh

Cette version de base ne traitera que 10 fichiers et en fera une copie dans le "musique_ok" sous les noms voulus.
Si c'est bon (répertoire cible et nom du fichier), on modifie une partie du musique.sh. La partie
Bloc de code:
find . -type f | grep -v ".DS_Store" | head 10 > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  cp "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"
sera à remplacer par
Bloc de code:
find . -type f | grep -v ".DS_Store" > "${liste_fic}"
while IFS= read -r fichier_full
do
  fichier_new=$(echo ${fichier_full} | sed "s#^\./##" | sed "s#/# - #g")
  mv "${fichier_full}" "${fichier_new}"
done <  "${liste_fic}"
Le "| head 10" disparait et le "cp" devient un "mv"

Après cette modification, cela traitera bien tous les fichiers et les déplacera (pas de copie). Pas besoin de supprimer les 10 fichiers déjà traités avant de relancer la commande.
Bloc de code:
./musique.sh

Bon, tu en auras avec "zic ordi" et "zic sofie" dans le nom mais c'est pas trop gênant. macOS sans très bien renommer en masse des fichiers pour enlever ou remplacer cette partie. C'est pour cela qu'elle n'est pas traité dans mon script.

Tu auras 3 fichiers txt créés avant le répertoire Musique_ok:
  1. liste_musique.txt : la liste de tous les fichiers trouvés dans "Musique_ok" et qui seront donc renommés
  2. liste_musique_doublon_1.txt : le résultat des cksum de ces fichiers (c'est fait après leur déplacement)
  3. liste_musique_doublon_2.txt : les fichiers dont le cksum est identique
 
Après cette modification, cela traitera bien tous les fichiers et les déplacera (pas de copie). Pas besoin de supprimer les 10 fichiers déjà traités avant de relancer la commande.
Bloc de code:
./musique.sh
Oups! C'est après avoir modifier le script qu'il faudra relancer le terminal pour être au bon endroit. Donc avant cette partie
 
Hahaha !
C'est affreux… je ne sais pas ce qui plante…. ça me met : no such file or directory

Capture d’écran 2020-10-01 à 17.30.50.png

Quand j'ouvre le Toshiba, à musique_ok… j'ai beau chercher les 10 fichiers test, rien ne s'est modifié...
 
Dernière édition par un modérateur:
Ok, il n'y a plus de problème pour lancer le script. Il faut maintenant trouver ce qui ne va pas quand il tourne.
Si tu ouvres le toshiba, vois-tu des fichiers liste_musique.txt, liste_musique_doublon_1.txt ou liste_musique_doublon_2.txt ?

Que donne la série de commande suivante si tu les passes dans le terminal ?
Bloc de code:
dde="/Volumes/TOSHIBA"
source="${dde}/Musique_ok"

ls -l "/Volumes"
ls -ld "${dde}"
ls -ld "${source}"
cd "${source}"
 
oui , dans le toshiba, je vois les fichiers txt, doublon1 et doublon 2.
voici le résultat avec la commande du terminal
 

Fichiers joints

  • Capture d’écran 2020-10-02 à 18.29.41.png
    Capture d’écran 2020-10-02 à 18.29.41.png
    423,9 KB · Affichages: 208
  • Capture d’écran 2020-10-02 à 18.30.44.png
    Capture d’écran 2020-10-02 à 18.30.44.png
    41,5 KB · Affichages: 212
Et le liste_musique.txt n'est pas vide. Contient-il bien une liste de fichiers de musique ?
 
Très bien, donc la source du problème semble être le find.

Si tu tapes ces deux commandes dans le terminal, quel est le résultat ?
Bloc de code:
cd "/Volumes/TOSHIBA/Musique_ok"
find . -type f | grep -v ".DS_Store" | head 10

S'il retourne bien une liste de fichier plus lisible, passe ensuite la suivante et regarde à nouveau le fichier liste_musique.txt
Bloc de code:
find . -type f | grep -v ".DS_Store" > ../liste_musique.txt
 
Dernière édition par un modérateur:
Ah zut ! Si le disque est protégé, c'est peut-être ça la cause du problème...

Les deux commandes suivantes retournent-elles une liste de fichiers/dossiers plus lisible ?
Bloc de code:
ls -l /Volumes/TOSHIBA/Musique_ok/*/*
ls -l /Volumes/TOSHIBA/Musique_ok/*/*/*
 
Dernière édition par un modérateur: