Como reordenar fisicamente os arquivos `03.mp3 01.mp3 02.mp3` (` ls -f`) em um diretório?

11

A ordem física dos arquivos é importante quando eu os copio no meu pendrive e ouço no mp3 player do carro. A maioria das pastas do meu álbum de música não está classificada , por exemplo, ls -fpode produzir:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Quando copio essa pasta no meu pen drive, os arquivos são copiados nessa ordem. O mp3 player do meu carro exibe os arquivos na ordem não classificada, o que não é o que eu quero. Posteriormente, posso reordenar os arquivos no pen drive (consulte: Como reordenar pastas? (Conforme exibido em `ls -U`) ), mas poderia evitá-lo completamente se eu pudesse reordená-los nesse diretório no disco rígido (ext4 )? Existe uma maneira de fazer isso?

(Na falta disso, pode haver uma maneira de escrever um findcomando, que obtém os arquivos, os classifica e depois os copia em ordem ??) Alguma sugestão?

ajo
fonte
Como alternativa, você pode classificar os arquivos depois de copiá-los para o mp3 player: superuser.com/questions/368623/…
eswald

Respostas:

5

É improvável que você consiga fazer isso no ext4. Diferentemente do FAT (32), que usava uma tabela linear de arquivos em um diretório, os sistemas de arquivos modernos usam estruturas complexas, como árvore B + (NTFS, XFS) ou árvore B com hash (ext3 / 4), onde todas as entradas são classificadas de acordo com um algoritmo específico.

Em particular, ext3 / 4 classifica os arquivos de acordo com o valor de hash do nome deles, para que você sempre obtenha os mesmos arquivos na mesma ordem. É possível desativar o recurso dir_index via tune2fs, mas pode custar desempenho se você tiver diretórios contendo muitos arquivos.


Um comando muito básico para isso pode ser o cp dir/* otherdir/local em que o shell classifica os nomes ao expandir argumentos e cpsimplesmente os copia na ordem dada.

Algo mais complexo, para copiar subdiretórios:

#!/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
fonte
É possível, por exemplo, moveos arquivos dizerem uma new_tmppasta e depois movê-los de volta, mas ditar a ordem? (Parece funcionar a partir de uma interface gráfica para as pastas ?!)
ajo
1
@ajo: Se o sistema de arquivos tiver o dir_index ativado, ele não funcionará. Independentemente de qual ordem você mover / criar arquivos, eles terão a mesma ordem de classificação, desde que tenham o mesmo nome. Tente, por exemplo, mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- os arquivos serão classificados na mesma ordem ( a c b .. d .no meu sistema), mesmo que tenham sido criados ao contrário.
precisa saber é o seguinte
o cp dir/* otherdir/parece muito mais fácil, mas usa a ordem original. eu poderia implementar a classificação lá?
ajo
2
@ ajo: O shell deve classificar os nomes dos arquivos antes do lançamento cp. Tente echo dir/*ver para o que eles se expandem. Mas, novamente, isso só importa ao copiar para cartões de memória FAT; isso não muda nada ao copiar para o ext4.
user1686
1
isso parece bom para diretório único? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo
2

Parece que os outros têm problemas semelhantes .

Ferramenta que permite aos usuários organizar arquivos de acordo com seus desejos e classificar o estilo de baixo nível do sistema de arquivos FAT.

A mesma ferramenta no freecode.com

Espero que ajude.

benjamin
fonte