Comment réorganiser physiquement les fichiers `03.mp3 01.mp3 02.mp3` (` ls -f`) dans un répertoire?

11

L' ordre physique des fichiers est important lorsque je les copie sur ma clé USB et que j'écoute dans le lecteur mp3 de la voiture. La plupart de mes dossiers d'albums musicaux ne sont pas triés , par exemple ls -fpeuvent produire:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Lorsque je copie ce dossier sur ma clé USB, les fichiers sont copiés dans cet ordre. Mon lecteur mp3 de voiture affiche les fichiers dans l'ordre non trié, ce qui n'est pas ce que je veux. Je peux par la suite réorganiser les fichiers sur la clé USB (voir: Comment réorganiser les dossiers? (Comme affiché dans `ls -U`) ), mais pourrait éviter cela si je pouvais les réorganiser dans ce répertoire sur mon disque dur (ext4 )? Y a-t-il un moyen de le faire?

(A défaut, il pourrait y avoir un moyen d'écrire une findcommande, qui récupère les fichiers, les trie, puis les copie dans l'ordre ??) Des suggestions?

ajo
la source
Alternativement, vous pouvez trier les fichiers après les avoir copiés sur le lecteur mp3: superuser.com/questions/368623/…
eswald

Réponses:

5

Il est peu probable que vous puissiez le faire sur ext4. Contrairement à FAT (32), qui utilisait une table linéaire de fichiers dans un répertoire, les systèmes de fichiers modernes utilisent des structures complexes telles que l'arbre B + (NTFS, XFS) ou l'arbre B haché (ext3 / 4), où toutes les entrées sont triées selon un algorithme spécifique.

En particulier, ext3 / 4 trie les fichiers en fonction de la valeur de hachage de leur nom, vous obtenez donc toujours les mêmes fichiers dans le même ordre. Il est possible de désactiver la fonction dir_index via tune2fs, mais cela peut vous coûter des performances si vous avez des répertoires contenant de nombreux fichiers.


Une commande très basique pour cela pourrait être cp dir/* otherdir/, où le shell trie les noms lors du développement des arguments, et les cpcopie simplement dans l'ordre donné.

Quelque chose de plus complexe, pour copier des sous-répertoires:

#!/usr/bin/env bash
srcdir=$1
destdir=$2

find "$srcdir" \( -type d -printf "0dir %P\0" \) \
            -o \( -type f -printf "1file %P\0" \) |
sort -z | while read -r -d '' type path; do
    case $type in
        "0dir") mkdir -vp "$destdir/$path";;
        "1file") cp -v "$srcdir/$path" "$destdir/$path";;
    esac
done
user1686
la source
Est-il possible, par exemple, que moveles fichiers contiennent un new_tmpdossier, puis de les reculer mais de dicter l'ordre? (Semble fonctionner à partir d'une interface graphique pour les dossiers?!)
ajo
1
@ajo: Si le système de fichiers a activé dir_index, cela ne fonctionnera pas. Quel que soit l'ordre dans lequel vous déplacez / créez les fichiers, ils auront le même ordre de tri tant qu'ils auront le même nom. Essayez, par exemple, mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- les fichiers seront triés dans le même ordre ( a c b .. d .dans mon système) même s'ils ont été créés à l'envers.
user1686
le cp dir/* otherdir/semble beaucoup plus facile, mais utilise l'ordre d'origine. puis-je implémenter le tri là-bas?
ajo
2
@ajo: Le shell est censé trier les noms de fichiers avant le lancement cp. Essayez echo dir/*de voir à quoi ils s'étendent. Mais encore une fois, cela n'a d'importance que lors de la copie sur des clés USB FAT; cela ne changera rien lors de la copie vers ext4.
user1686
1
Est-ce que cela semble OK pour un seul répertoire? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo
2

On dirait que d'autres ont des problèmes similaires .

Outil qui permet aux utilisateurs d'organiser les fichiers selon leurs souhaits et de trier le style de bas niveau du système de fichiers FAT.

Même outil sur freecode.com

J'espère que ça aide.

Benjamin
la source