Як фізично упорядкувати файли `03.mp3 01.mp3 02.mp3` (` ls -f`) у каталозі?


11

Фізичний порядок файлів має значення , коли я копіюю їх на моїй флешку і слухати в автомобілі mp3 - плеєр. Більшість папок моїх музичних альбомів є несортованими , наприклад, вони ls -fможуть видавати:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Коли я копіюю цю папку на USB-накопичувач, файли копіюються в тому порядку. Мій автомобільний mp3-плеєр відображає файли в несортованому порядку, а це не те, що я хочу. Згодом я можу переупорядкувати файли на USB-накопичувачі (див.: Як упорядкувати папки? (Як показано в `ls -U`) ), але я могла взагалі цього уникнути, якби я могла переупорядкувати їх у цьому каталозі, їх на своєму жорсткому диску (ext4 )? Чи є спосіб зробити це?

(Якщо цього не відбувається, може бути спосіб написання findкоманди, який отримує файли, сортує їх, а потім копіює їх у порядку ??) Будь-які пропозиції?


Крім того , можна сортувати файли після копіювання їх на mp3 - плеєр: superuser.com/questions/368623 / ...
eswald

Відповіді:


5

Навряд чи ви зможете це зробити на ext4. На відміну від FAT (32), який використовував лінійну таблицю файлів у каталозі, сучасні файлові системи використовують складні структури, такі як B + дерево (NTFS, XFS) або хешированное B-дерево (ext3 / 4), де всі записи сортуються відповідно до конкретний алгоритм.

Зокрема, ext3 / 4 сортує файли відповідно до хеш-значення їх імені, тому ви завжди отримуєте ті самі файли в одному порядку. Можна відключити функцію dir_index через tune2fs, але це може коштувати вам продуктивності, якщо у вас є каталоги, що містять багато файлів.


Дуже базовою командою для цього може бути cp dir/* otherdir/, коли оболонка сортує імена при розширенні аргументів та cpпросто копіює їх у заданому порядку.

Щось складніше для копіювання підкаталогів:

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

Чи можливо, наприклад, moveу файлах сказати new_tmpпапку, а потім перемістити їх назад, але диктувати порядок? (Здається, працює з GUI для папок ?!)
12.12

1
@ajo: Якщо у файловій системі ввімкнено dir_index, вона не працюватиме. Незалежно від того, в якому порядку ви переміщуєте / створюєте файли, вони матимуть однаковий порядок сортування, якщо вони мають однакове ім'я. Спробуйте, наприклад, mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- файли будуть відсортовані в тому самому порядку ( a c b .. d .в моїй системі), навіть якщо вони були створені в зворотному порядку.
користувач1686

cp dir/* otherdir/виглядає набагато простіше, але використовує вихідний порядок. Чи можу я здійснити сортування там?
айо

2
@ajo: оболонка повинна сортувати імена файлів перед запуском cp. Спробуйте echo dir/*побачити, на що вони розширюються. Але знову ж таки, це важливо лише при копіюванні на пам'ять FAT; він нічого не змінить при копіюванні в ext4.
користувач1686

1
це виглядає нормально для одного каталогу? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
айо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.