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

jane23

Membre confirmé
25 Août 2020
53
1
42
Bonjour,

J'ai vu que le sujet avait déjà été traité mais je ne comprends pas trop... je vous prie de m'excuser.
J'ai réussi à trouver le "Terminal" mais après, je sèche sur la manip.

À l'époque, j'avais arrêté d'utiliser mon Mac et j'avais fait une copie sur mon dde.

Mais voilà, maintenant le truc s'est classé en dossiers et sous-dossiers et cela crée une arborescence trop importante !!

Je ne peux plus accéder à ma musique comme je le veux sachant qu il y a 29 500 chansons qui représentent 186 Go... ça fait très long. Un par un, le travail serait titanesque...

Merci pour votre aide

Cordialement,

jennifer
 
Dernière édition par un modérateur:
Donc déplacer tous les fichiers quelque part ?

Quel est le répertoire contenant tes fichiers et où veux-tu les avoir à la fin ?
Une fois tous les fichiers déplacés, on pourra supprimer les dossiers et sous-dossier.

Exemple : la commande suivante va chercher tous les fichiers avec l'extension m4a présent dans le répertoire music et les copier (par sécurité plutôt que de les déplacer pendant ce test) dans le répertoire "rep_fichier"
Bloc de code:
find "/Users/username/Music" -type f -name "*.m4a" -exec cp "{}" "/Users/username/rep_fichier/." \;

Si cela fonctionne bien :
  • tu peux remplacer le "cp" par un "mv" qui déplacera les fichiers
  • tu peux supprimer le la partie suivante pour déplacer tous les fichiers sans tenir compte du nom (cela ne déplacera pas les répertoire) : -name "*.m4a"

Donc cela peut servir de base pour ta demande
 
Bonjour,
Merci de ta réponse.

Oui, je veux créer un nouveau dossier avec tous les fichiers dedans.

ex : nouveau dossier que j 'appelle par exemple musique rangée puis double clic habituel et hop toutes les chansons réunies d'un coup.

Le répertoire initial est dans le dossier iTunes = iTunes media = Music et j'aimerais qu'il soit dans un dossier lambda comme dit plus haut.

Alors pour la manip, je dois aller dans le terminal ? et taper le bloc de code cité dans ton message ?

-----------------------------------

bon, je viens d'essayer de copier le bloc de code que tu as écris dans le terminal mais ça ne fait rien...
j'dois pas faire le bon truc, à mon avis
 
Dernière édition par un modérateur:
Donc dans le terminal, tape la commande suivante :
Bloc de code:
find ~/Music -type f -name "*.m4a" | head

Cela retourne-t-il bien des fichiers qui t'intéressent (10 pour ce test) ?

Passe la commande suivante dans le terminal :
Bloc de code:
mkdir ~/Musique_ok
Cela devrait te créer un dossier "Musique_ok" dans le répertoire de ton user

Si ces deux points sont bon, tu peux tester la commande suivante :
Bloc de code:
find ~/Music -type f -name "*.m4a" -exec cp "{}" ~/Musique_ok/ \;

Là cela devrait être bon et tu devrais avoir tes fichiers contenant l'extension "m4a" dans le dossier "Musique_ok"
 
Ça fonctionne. C'est incroyable ces lignes de codes ! c'est intriguant..

Donc, c'est entrain de déplacer les fichiers et non de les copier ? car j'ai mon disque de démarrage qui commence à me dire qu'il est presque plein... 'espace disque limité'

Ensuite je me rends compte que j'ai les chansons, comme prévu, mais que les artistes n'apparaissent pas .. j'ai mal réfléchi à mon truc... bon bref..

Et ensuite, comment refaire la même manipulation mais avec les autres fichiers, autres que m4a ?

Oué ca y est, 'no space left on device'
 
Dernière édition par un modérateur:
Oui, par défaut j'ai fait "cp" dans la commande. Cela fait une copie et non un déplacement.
Plus pratique pour revenir en arrière s'il y a un point sur lequel réfléchir ;)

Pour annuler la commande du terminal en cours, utilise la combinaison :
ctrl+c

Tu peux supprimer le "Musique_ok" (le nouveau répertoire, pas l'ancien) qui nous a servi de test pour le moment.

Combien as-tu d'artiste à traiter ? Normalement, c'est le nom du premier répertoire.

Au lieu de :
Bloc de code:
find ~/Music -type f -name "*.m4a" -exec cp "{}" ~/Musique_ok/ \;
On peux utiliser ceci qui copiera tous les fichiers quelque soit leur extension :
Bloc de code:
find ~/Music -type f -exec cp "{}" ~/Musique_ok/ \;

Et plutôt que cp, on peut utiliser mv qui déplacera les fichiers. Mais là il faut être certain que le résultat est bien ok.
Une sauvegarde TimeMachine avant de faire cette méthode est recommandé.


Sinon pour explication : la commande "find" faire une recherche avec les paramètres indiqués (ici des élément de type fichier se finissant par m4a). J'utiliser son option "exec" qui permet de lancer une commande en utilisant ce qu'elle trouve.
 
Je ne sais comment comptabiliser le nombre de dossiers... j'ai l'impression que ça n'apparait nulle part.

Y'en a 52 par page et 186 Go en tout (29405 éléments) et le nom du premier répertoire, il me semble que c'est /user = musique = iTunes= iTunes media

J'ai une sauvegarde sur mon disque dur externe ; dans tous les cas, je ne perdrai rien mais d'accord pour info Time Machine.

Ok.. merci pour les explications. C'est vraiment intéressant.

Ne penses tu pas qu'il serait plus judicieux, finalement, de garder le premier dossier (nom de l'artiste) = double clic = les chansons, point, et de squeezer simplement les sous-dossiers ?
C'est possible de faire ça ?

Merci du temps que tu m'accordes
 
Dernière édition par un modérateur:
Vu ce que tu souhaites, on ne va pas pouvoir faire ça en une seule commande. Avec un script shell, par contre ce sera possible de faire ça assez facilement. Et de rajouter un peu plus de flexibilité/information lors de l'opération.

Pour récapituler :
• S'occuper uniquement des fichiers présents dans "~/Music/iTunes/iTunes Media/Music"
• Les déplacer dans un répertoire dédié : on reste bien sur le disque du mac ou tu veux faire ça sur un disque externe ? La solution du disque externe permettrait de faire une copie et donc de prendre le moins de risque possible. Le "~/Musique_ok" te convient comme base ou tu souhaites autre chose ?
• Que faire en cas de fichiers portant le même nom ? Conserver les deux en rajoutant un numéro à la fin ?

Si on a par exemple ceci :
~/Music/iTunes/iTunes Media/Music/rep1/rep2/fichier1
~/Music/iTunes/iTunes Media/Music/rep1/rep3/fichier2
~/Music/iTunes/iTunes Media/Music/rep4/rep5/fichier3
~/Music/iTunes/iTunes Media/Music/rep4/rep6/fichier4

Après le déplacement des fichiers, une arborescence comme celle-ci te convient bien ?
~/Musique_ok/rep1/fichier1
~/Musique_ok/rep1/fichier2
~/Musique_ok/rep4/fichier3
~/Musique_ok/rep4/fichier4

On pourrait même conserver la deuxième série de répertoire dans le nom des fichiers pour avoir ça. Cela éviterait le problème des fichiers portant le même nom.
~/Musique_ok/rep1/rep2_fichier1
~/Musique_ok/rep1/rep3_fichier2
~/Musique_ok/rep4/rep5_fichier3
~/Musique_ok/rep4/rep6_fichier4
"rep2_fichier1", "rep2-fichier1" ou même "rep2 fichier1". A toi de choisir le séparateur si on part sur cette solution.

A toi de voir ce que tu souhaites.
Je prendrais un peu de temps pour faire le script ensuite, cela ne devrait pas me prendre plus d'une 1h grand maximum (en incluant des tests). Mais il faudra attendre ce soir pour que ce soit terminé.
 
Bon, je ne vais pas m'embêter et conserver le nom des répertoires dans les fichiers :p

Exemple :
~/Musique_ok/rep1/rep2 - fichier1
~/Musique_ok/rep1/rep3 - fichier2
~/Musique_ok/rep4/rep5 - fichier3
~/Musique_ok/rep4/rep6 - fichier4
Capture d’écran 2020-08-27 à 21.05.23.png

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)
Bloc de code:
#!/bin/bash
source=$(echo ~/"Music/iTunes/iTunes Media/Music")
destination=$(echo ~/"Musique_ok")
#Fonction appellée par le find
function move_file {
  fichier_full="$1"
  rep_destination="$2"
  rep_base=$(echo ${fichier_full} | sed "s#^./##" | sed "s#/.*##")
  fichier_destination=$(echo ${fichier_full} | sed "s#^./${rep_base}/##" | sed "s#/# - #g")
  echo "${fichier_full}"
  if [ ! -d "${rep_destination}/${rep_base}" ] ; then mkdir "${rep_destination}/${rep_base}" ; fi
  mv "${fichier_full}" "${rep_destination}/${rep_base}/${fichier_destination}"
}
#Pour utiliser la fonction dans le find
export -f move_file
if [ ! -d "${destination}" ] ; then mkdir "${destination}" ; fi
cd "${source}"
find . -type f -exec bash -c 'move_file "{}" '"${destination}"'' \;

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:
Bloc de code:
./musique.sh

Ce script t'affichera chaque fichier traité avant de le déplacer dans le répertoire.
Le répertoire de destination "Musique_ok" est créé automatiquement tout comme celui de l'artiste. Pas besoin de le créer de ton côté ;)
 
Dernière édition par un modérateur:
  • Haha
  • J’aime
Réactions: litobar71 et Nikware
Bonjour,

Je te remercie pour tes messages, ça a l'air top !
Je te prie de m'excuser pour hier, je n'étais pas dispo et avec le décalage horaire, métropole, caraïbes... ça fait long sans réponse.
Je vois ça dans la journée...

Je te suis vraiment reconnaissante.
Je te tiens au courant
 
Dernière édition par un modérateur:
bonjour,
ok, ca y est. il est 9h48, nous sommes dimanche. j'ai du temps devant moi pour bien me concentrer et suivre tes instructions.
encore désolée pour ne pas m être connectée depuis ce temps.

bon et bien.. je ne sais pas si tu auras le temps mais je ne parviens pas à enregistrer le code dans text édit sous ".sh" dans le répertoire de base.
ils disent l'extension exigée est ".rtf"
 
OK. J'ai réussi * musique.sh* mais après, non
je t'envoie la capture d 'écran :

Capture d’écran 2020-09-06 à 11.05.44.png

J'ai essayé la première commande= enter= puis la 2e commande... rien
du coup, j'ai essayé 1ère et 2e commande en même temps... et rien...

C'est quoi que je loupe ?
 
Dernière édition par un modérateur:
A priori le fichier musique.sh n'est pas bon. Le message indique qu'il s'agit d'un répertoire :eek:
Peux-tu vérifier via le Finder ? Si c'est le cas, efface le (s'il n'y a rien dedans) et recommence la création du fichier via textedit.
 
Et bah écoute, ça a marché!!!
C'est top!! je suis vraiment heureuse. J'ai bien les noms des artistes puis clic puis toutes leurs chansons..
Par contre, ça a marché pour 23 762 éléments sur les 29 405 de départ..

Je viens de recalculer... par lire les infos... en fait y'a 31 800 éléments (c'et bizarre d'ailleurs, par rapport au nombre que je t'ai donné la dernière fois... je suis certaine de ne pas avoir ajouté de musique dans le dossier toshiba zikjen...)
Je t'envoie une copie d'écran :

Capture d’écran 2020-09-06 à 15.40.47.png
 
Dernière édition par un modérateur:
C'est sans doute la limite du find ;)
Relance le script, s'il reste des fichiers à déplacer il le fera. Il reprendra là où il en était

Donc juste cette commande à repasser :
Bloc de code:
./musique.sh
 
je ne parviens pas à aller plus loin que 23 778..
j'essaie de trouver manuellement des chansons qui pourraient manquer mais je ne trouve pas.
 
En élément de départ, les sous-répertoires doivent être comptés, donc cela fera une différence en nombre d'élément.

Par contre la différence de taille me gène plus. Normalement pas de doublons car les fichiers contiennent le nom des répertoires source. Donc il doit manquer quelque chose mais quoi ?
 
Et oué...
Je crois des chansons par ci par là...
Par exemple, je viens de trouver 3 mix (hvob) en dehors de dossier qui ne se trouvent pas dans musique ok...
capture d'écran :

Capture d’écran 2020-09-06 à 16.47.58.png
 
Dernière édition par un modérateur:
Je vois, sans doute un problème avec certains caractères. Je regarderai ça en détail demain soir