¿Cómo reordenar físicamente los archivos `03.mp3 01.mp3 02.mp3` (` ls -f`) en un directorio?


11

El orden físico de los archivos es importante cuando los copio en mi memoria USB y escucho en el reproductor de mp3 del automóvil. La mayoría de mis carpetas de álbumes de música no están ordenadas , por ejemplo, ls -fpueden producir:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Cuando copio esa carpeta en mi memoria USB, los archivos se copian en ese orden. El reproductor de mp3 de mi automóvil muestra los archivos en el orden no ordenado, que no es lo que quiero. Puedo posteriormente reordenar los archivos en la memoria USB (véase: Cómo reordenar las carpetas (como se muestra en `ls -U`)? ), Pero podría evitar que en conjunto si pudiera cambiar su orden dentro de ese directorio de ellas en mi disco duro (ext4 )? ¿Hay alguna forma de hacerlo?

(De lo contrario, puede haber una forma de escribir un findcomando, que obtiene los archivos, los ordena y luego los copia en orden ??) ¿Alguna sugerencia?


Como alternativa, puede ordenar los archivos después de copiarlos en el reproductor de mp3: superuser.com/questions/368623/...
eswald

Respuestas:


5

Es poco probable que pueda hacer esto en ext4. A diferencia de FAT (32), que usaba una tabla lineal de archivos en un directorio, los sistemas de archivos modernos usan estructuras complejas como el árbol B + (NTFS, XFS) o el árbol B hash (ext3 / 4), donde todas las entradas se ordenan de acuerdo con Un algoritmo específico.

En particular, ext3 / 4 clasifica los archivos de acuerdo con el valor hash de su nombre, por lo que siempre obtiene los mismos archivos en el mismo orden. Es posible deshabilitar la función dir_index a través de tune2fs, pero puede costarle rendimiento si tiene directorios que contienen muchos archivos.


Un comando muy básico para esto podría ser cp dir/* otherdir/, donde el shell ordena los nombres al expandir los argumentos, y cpsimplemente los copia en el orden dado.

Algo más complejo, para copiar subdirectorios:

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

¿Es posible, por ejemplo, que movelos archivos digan una new_tmpcarpeta y luego moverlos de regreso pero dictar el orden? (¿Parece funcionar desde una GUI para las carpetas?)
ajo

1
@ajo: si el sistema de archivos tiene dir_index habilitado, no funcionará. Independientemente del orden en el que mueva / cree los archivos, tendrán el mismo orden de clasificación siempre que tengan el mismo nombre. Intente, por ejemplo, que mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2los archivos se ordenarán en el mismo orden ( a c b .. d .en mi sistema) aunque se hayan creado a la inversa.
user1686

Se cp dir/* otherdir/ve mucho más fácil, pero utiliza el orden original. ¿podría implementar la clasificación allí?
ajo

2
@ajo: se supone que el shell debe ordenar los nombres de los archivos antes de iniciarlos cp. Intenta echo dir/*ver a qué se expanden. Pero de nuevo, solo importa cuando se copia en tarjetas de memoria FAT; será no cambiar nada cuando se copia a ext4.
user1686

1
¿esto se ve bien para un solo directorio? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.