Bagaimana cara menyusun ulang file secara fisik `03.mp3 01.mp3 02.mp3` (` ls -f`) dalam direktori?

11

Urutan fisik file penting ketika saya menyalinnya ke stik USB saya dan mendengarkan di pemutar mp3 mobil. Sebagian besar folder album musik saya tidak disortir , misalnya ls -fdapat menghasilkan:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Ketika saya copy folder yang ke saya USB stick, file disalin di bahwa pesanan. Mobil mp3 player saya menampilkan file dalam urutan yang tidak disortir, yang bukan yang saya inginkan. Saya kemudian dapat menyusun ulang file pada USB stick (lihat: Bagaimana cara menyusun ulang folder? (Seperti yang ditampilkan dalam `ls -U`) ), tetapi dapat menghindarinya sama sekali jika saya dapat menyusun ulang semuanya dalam direktori tersebut pada hard drive saya (ext4 )? Apakah ada cara untuk melakukan itu?

(Gagal itu, mungkin ada cara menulis findperintah, yang mendapatkan file, mengurutkannya, dan kemudian menyalinnya ??) Ada saran?

ajo
sumber
Atau, Anda dapat mengurutkan file setelah menyalinnya ke pemutar mp3: superuser.com/questions/368623/…
eswald

Jawaban:

5

Tidak mungkin Anda dapat melakukan ini di ext4. Tidak seperti FAT (32), yang menggunakan tabel linear file dalam direktori, filesystem modern menggunakan struktur kompleks seperti B + tree (NTFS, XFS) atau hashed B-tree (ext3 / 4), di mana semua entri diurutkan sesuai dengan suatu algoritma spesifik.

Secara khusus, ext3 / 4 mengurutkan file sesuai dengan nilai hash dari namanya, sehingga Anda selalu mendapatkan file yang sama dalam urutan yang sama. Dimungkinkan untuk menonaktifkan fitur dir_index melalui tune2fs, tetapi mungkin dikenakan biaya kinerja jika Anda memiliki direktori yang berisi banyak file.


Perintah yang sangat mendasar untuk ini adalah cp dir/* otherdir/, di mana shell mengurutkan nama ketika memperluas argumen, dan cpcukup menyalinnya dalam urutan yang diberikan.

Sesuatu yang lebih kompleks, untuk menyalin subdirektori:

#!/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
pengguna1686
sumber
Apakah mungkin untuk misalnya movefile mengatakan new_tmpfolder, dan kemudian memindahkannya kembali tetapi mendikte pesanan? (Tampaknya bekerja dari dalam GUI untuk folder ?!)
ajo
1
@ajo: Jika filesystem telah dir_index diaktifkan, itu tidak akan berfungsi. Terlepas dari urutan mana Anda memindahkan / membuat file, mereka akan memiliki urutan pengurutan yang sama selama mereka memiliki nama yang sama. Coba, misalnya, mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- file akan disortir dalam urutan yang sama ( a c b .. d .di sistem saya) meskipun mereka dibuat secara terbalik.
user1686
yang cp dir/* otherdir/terlihat jauh lebih mudah, tetapi menggunakan urutan asli. dapatkah saya menerapkan penyortiran di sana?
ajo
2
@ajo: Shell seharusnya mengurutkan nama file sebelum diluncurkan cp. Cobalah echo dir/*untuk melihat apa yang mereka kembangkan. Tetapi sekali lagi, itu hanya penting ketika menyalin ke memory stick FAT; itu tidak akan mengubah apa pun saat menyalin ke ext4.
user1686
1
apakah ini terlihat OK untuk direktori tunggal? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo
2

Sepertinya orang lain memiliki masalah yang sama .

Alat yang memungkinkan pengguna mengatur file sesuai dengan keinginan mereka dan mengurutkan gaya sistem file FAT tingkat rendah.

Alat yang sama di freecode.com

Semoga ini bisa membantu.

benjamin
sumber