1 votes

Bash, aplatir un répertoire à plusieurs niveaux tout en renommant les fichiers

Je sais que cela va sembler un peu étrange, mais s'il vous plaît, soyez patient avec moi.

Le système d'infodivertissement de ma voiture semble avoir une limite sur le nombre de répertoires musicaux et de fichiers qu'il reconnaîtra sur une clé USB : il ignorera aléatoirement des répertoires ou des fichiers pour s'adapter à cette limite.

Ma structure de répertoires actuelle est

Bibliothèque musicale
 Artiste1
    Album1
        Disque 1
            Piste1
            PisteN

        Disque 2
            Piste1
            PisteN

    Album2
        Piste1
        PisteN

 Artiste2
     Album1
         Piste1
         PisteN

etc.

J'aimerais aplatir les répertoires en copiant les fichiers dans un répertoire appelé "Flat", cependant, il arrive que le nom du fichier soit dupliqué, donc j'en perdrai certains, et le système d'infodivertissement supprimera tout fichier après un certain nombre.

Mon plan était d'utiliser quelque chose du genre

find /Musique -mindepth 2 -type f -exec cp {} /Flat/"$RANDOM"_{} ';'

L'idée derrière cela est que en préfixant le nom de fichier avec un nombre aléatoire, chaque fois que j'exécute ceci, il choisira un nom de fichier différent, permettant au système d'infodivertissement d'avoir une sélection différente.

Cependant, cela essaie (et échoue) de créer les fichiers avec des barres obliques dedans.

Que puis-je utiliser à la place des {} pour supprimer le chemin de destination.

2voto

David Anderson Points 30783

Vous pouvez utiliser -execdir à la place de -exec, comme illustré ci-dessous. Le principal -execdir est identique au principal -exec à l'exception que la commande cp sera exécutée à partir du répertoire qui contient le fichier actuel. Le nom de fichier remplacé par la chaîne {} ne contient pas le chemin. (En d'autres termes, le nom de fichier remplacé par la chaîne {} n'est pas qualifié.)

find /Musique -mindepth 2 -type f -execdir cp {} /Plat/"$RANDOM"_{} ';'

Si vous souhaitez un numéro aléatoire différent à chaque fois qu'une copie est faite, alors vous pourriez avoir besoin de quelque chose comme la commande donnée ci-dessous.

find /Musique -mindepth 2 -type f -execdir bash -c 'cp "{}" "/Plat/${RANDOM}_{}"' ';'

0voto

Christopher Scott Points 665

Je pense que tout entasser dans un répertoire plat va causer encore plus de problèmes, sans oublier la folie que ce sera d'itérer à travers les pistes. À mon avis, votre stéréo doit avoir une notion de sauter une piste, et de sortir du dossier actuel une fois que vous en avez fini avec celui-ci? La randomisation rendrait également essentiellement impossible de trouver la chanson que vous voulez.

Sans connaissance de votre stéréo, opter pour un compromis de seulement 1 sous-répertoire, peut-être deux, est probablement (espérons-le) une solution assez bonne.

Avec un seul répertoire, vous voudriez probablement des dossiers qui sont : Nom de l'artiste - Nom de l'album avec des noms de pistes de 1-01 - Titre… pour des albums à plusieurs disques et 01 - Titre pour ceux sans. Sinon, vous pouvez simplement utiliser la dénomination de version d'album à plusieurs disques pour tout, à condition que "pas de numéro de disque" donne comme résultat 1. (Ou 0, un zéro initial est bien, mais un - initial n'est probablement pas approprié quelque part.)

Cela est possible mais terriblement compliqué à faire dans un script seul. Il existe sûrement des logiciels pour vous aider à gérer cela, je ne sais pas quel est ce logiciel. Vous devez (1) créer les sous-répertoires, (2) copier les fichiers à leur nouvel emplacement approprié dans les sous-répertoires nouvellement créés, et (3) les renommer avec l'étiquette du disque afin de ne pas mélanger les pistes du Disque 1, du Disque 2 et des pistes du Disque n qui ne sont par ailleurs pas différenciées.

Je peux m'en approcher, et cela fonctionne pour moi car je nomme déjà mes fichiers avec des formats Disquenr-Pistenuméro - Titre lorsque plusieurs disques sont présents, malgré qu'ils soient aussi organisés en sous-dossiers:

find . -type f |awk 'BEGIN {FS="/"}{ printf "mkdir \"/Plat/%s - %s\"; cp \"%s\" \"/Plat/%s - %s/\"", $2, $3, $0, $2, $3; print ""}'
mkdir "/Plat/DDR - DDRMAX"; cp "./DDR/DDRMAX/Disc 1/1-01 Lovin' You (Rob Searle club mix).m4a" "/Plat/DDR - DDRMAX/"
mkdir "/Plat/DDR - DDRMAX"; cp "./DDR/DDRMAX/Disc 1/1-02 Somewhere Over the Rainbow.m4a" "/Plat/DDR - DDRMAX/"
mkdir "/Plat/DDR - DDRMAX"; cp "./DDR/DDRMAX/Disc 2/2-01 Select.m4a" "/Plat/DDR - DDRMAX/"
mkdir "/Plat/DDR - DDRMAX"; cp "./DDR/DDRMAX/Disc 2/2-02 WWW.Blonde Girl (Momo mix).m4a" "/Plat/DDR - DDRMAX/"
mkdir "/Plat/Metallica - Load"; cp "./Metallica/Load/01 Ain't My Bitch.m4a" "/Plat/Metallica - Load/"
mkdir "/Plat/Metallica - Load"; cp "./Metallica/Load/02 2 X 4.m4a" "/Plat/Metallica - Load/"

Notez que j'ai pris quelques libertés avec la sortie comme réorganiser ma sortie pour la lister de manière plus lisible pour prouver sa fonction.

Vous ajouteriez alors | sh à la fin de cette commande pour qu'elle effectue le travail en exécutant les commandes listées ici. Cette sortie ne fait que d'afficher une chaîne pour vérifier que les commandes que vous voulez exécuter agiraient comme vous le souhaitez.

Cette solution signifie que vous obtiendrez une tonne d'erreurs de "dossier déjà existant", mais ce ne sont qu'une nuisance et n'arrêtent pas le processus.

Faisable, oui. Sainement? Ehhhhhhhhhhhhhhhhhhhhhh. Dépend surtout de la rigueur exacte et de l'organisation de votre nommage de fichiers source.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X