Come riordinare fisicamente i file `03.mp3 01.mp3 02.mp3` (` ls -f`) in una directory?


11

L' ordine fisico dei file è importante quando li copio sulla mia chiavetta USB e ascolto nel lettore mp3 per auto. La maggior parte delle cartelle dei miei album musicali non sono ordinate , ad esempio ls -fpossono produrre:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Quando copio quella cartella sulla mia chiavetta USB, i file vengono copiati in questo ordine. Il lettore mp3 della mia auto visualizza i file nell'ordine non ordinato, che non è quello che voglio. Successivamente posso riordinare i file sulla chiavetta USB (vedi: Come riordinare le cartelle? (Come mostrato in `ls -U`) ), ma potrei evitarlo del tutto se potessi riordinarli all'interno di quella directory sul mio disco rigido (ext4 )? C'è un modo per farlo?

(In caso contrario, potrebbe esserci un modo per scrivere un findcomando, che ottiene i file, li ordina e poi li copia in ordine ??) Qualche suggerimento?


In alternativa, è possibile ordinare i file dopo averli copiati sul lettore mp3: superuser.com/questions/368623/…
eswald

Risposte:


5

È improbabile che tu possa farlo su ext4. A differenza di FAT (32), che utilizzava una tabella lineare di file in una directory, i moderni filesystem utilizzano strutture complesse come B + tree (NTFS, XFS) o hash con B-tree (ext3 / 4), dove tutte le voci sono ordinate in base a un algoritmo specifico.

In particolare, ext3 / 4 ordina i file in base al valore hash del loro nome, in modo da ottenere sempre gli stessi file nello stesso ordine. È possibile disabilitare la funzione dir_index tramite tune2fs, ma potrebbe costare le prestazioni se si dispone di directory contenenti molti file.


Un comando molto semplice potrebbe essere quello in cp dir/* otherdir/cui la shell ordina i nomi quando espande gli argomenti e cpli copia semplicemente nell'ordine indicato.

Qualcosa di più complesso, per copiare le sottodirectory:

#!/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

È possibile, ad esempio, che movei file dicano una new_tmpcartella e quindi spostarli indietro ma dettare l'ordine? (Sembra funzionare all'interno di una GUI per le cartelle ?!)
ajo

1
@ajo: se il filesystem ha dir_index abilitato, non funzionerà. Indipendentemente dall'ordine in cui sposti / crei i file, avranno lo stesso ordinamento purché abbiano lo stesso nome. Prova, ad esempio, mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- i file verranno ordinati nello stesso ordine ( a c b .. d .nel mio sistema) anche se sono stati creati al contrario.
user1686

la cp dir/* otherdir/guarda molto più facile, ma utilizza l'ordine originale. potrei implementare l'ordinamento lì?
ajo

2
@ajo: la shell dovrebbe ordinare i nomi dei file prima del lancio cp. Prova echo dir/*a vedere a cosa si espandono. Ma ancora una volta, importa solo quando si copia su memory stick FAT; essa non cambia nulla quando si copiano a ext4.
user1686

1
sembra OK per singola directory? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo

2

Sembra che altri abbiano problemi simili .

Strumento che consente agli utenti di organizzare i file secondo i loro desideri e ordina lo stile di basso livello del file system FAT.

Lo stesso strumento su freecode.com

Spero che sia d'aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.