Как физически переупорядочить файлы `03.mp3 01.mp3 02.mp3` (` ls -f`) в каталоге?


11

Физический порядок файлов имеет значение , когда я копирую их на моей флешку и слушать в автомобиле mp3 - плеер. Большинство моих альбомов музыки папок Unsorted , например , 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 для папок ?!)
ajo

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 .в моей системе), даже если они были созданы в обратном порядке.
user1686

cp dir/* otherdir/выглядит намного проще, но использует исходный порядок. я мог бы осуществить сортировку там?
ajo

2
@ajo: Оболочка должна сортировать имена файлов перед запуском cp. Попытайтесь echo dir/*увидеть, к чему они расширяются. Но опять же, это имеет значение только при копировании на карты памяти FAT; это ничего не изменит при копировании в ext4.
user1686

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.