Команда dirsplit

Команда dirsplit позволяет использовать утилиту с соответствующим именем для создания списка файлов, умещающихся на носитель данных заданного пользователем объема. Данная утилита была особенно актуальна в годы популярности оптических носителей, но вполне может пригодиться и в наши дни для автоматической сортировки файлов перед их копированием на флеш-накопители малого объема. Утилита может как сформировать списки файлов для каждого из носителей данных заданного объема, так и рассортировать файлы по директориям для их переноса в ручном режиме. По умолчанию при сортировке файлов используется специальный алгоритм, позволяющий максимально эффективно использовать пространство накопителя данных, ввиду чего не стоит предполагать, что файлы будут рассортированы в алфавитном порядке.

Базовый синтаксис команды выглядит следующим образом:

$ dirsplit [параметры] имя-директории-с-файлами

Команда dirsplit может использоваться без каких-либо параметров, но путь к директории с файлами придется указывать в любом случае. Наиболее важными параметрами являются параметр -s, позволяющий указать объем носителя данных, -m для перемещения файлов в отдельные директории вместо создания их списков, -l для создания отдельных директорий с символьными ссылками на файлы вместо их списков, а также -p для указания префикса результирующих файлов со списками или директорий. Кроме того, существует параметр -S, позволяющий сортировать файлы в алфавитном порядке и пренебрегать потерями пространства накопителей.

Установка утилиты

С большой вероятностью утилита уже установлена в вашей системе, но если это не так, вам придется установить ее самостоятельно; проще всего это сделать с помощью терминала путем исполнения соответствующей вашему дистрибутиву команды.

Команда для Linux Mint, Debian и Ubuntu:

$ sudo apt-get install genisoimage

Команда для Fedora Workstation:

$ sudo dnf install dirsplit

Примеры использования

Сортировка файлов для записи на оптические диски

Будем считать, что у нас имеется директория с MP3-файлами объемом в 2.6 Гб, содержимое которой должно быть записано на CD-диски объемом в 700 Мб:

$ du -h "10 Years Of Enhanced 2008-2018"
2,6G 10 Years Of Enhanced 2008-2018

Несложно подсчитать, что для этой цели понадобится как минимум 4 CD-диска. Для того, чтобы оптимально распределить файлы по дискам, следует использовать утилиту dirsplit, указав объем CD-диска:

$ dirsplit -s 700M "10 Years Of Enhanced 2008-2018"
Building file list, please wait...
Calculating, please wait...
....................
Calculated, using 4 volumes.
Wasted: 1713132 Byte (estimated, check mkisofs -print-size …)

Из вывода видно, что утилита рассортировала файлы на четыре диска (using 4 volumes), при этом будет потеряно менее 2 Мб пространства накопителей (Wasted: 1713132 Byte). Результат работы утилиты представлен четырьмя файлами, имена которых начинаются на vol_ (этот префикс при желании может быть изменен) и содержат расширение .list:

$ ls -al vol_*
-rw-rw-r-- 1 alex alex 6048 июн 20 15:31 vol_1.list
-rw-rw-r-- 1 alex alex 5760 июн 20 15:31 vol_2.list
-rw-rw-r-- 1 alex alex 9290 июн 20 15:31 vol_3.list
-rw-rw-r-- 1 alex alex 2358 июн 20 15:31 vol_4.list

Нумерация файлов начинается с 1, а не с 0. Сами файлы содержат списки файлов из указанной директории для копирования на накопитель данных в простом формате:

$ cat vol_1.list 
/051. VA - 10 Years Of Enhanced Side 1 (Continuous Mix).mp3=/mnt/archive/Archive/dirsplit/10 Years Of Enhanced 2008-2018/051. VA - 10 Years Of Enhanced Side 1 (Continuous Mix).mp3
/106. Andrew Benson - Wohoo .mp3=/mnt/archive/Archive/dirsplit/10 Years Of Enhanced 2008-2018/106. Andrew Benson - Wohoo .mp3
/132. Axis - Lotus.mp3=/mnt/archive/Archive/dirsplit/10 Years Of Enhanced 2008-2018/132. Axis — Lotus.mp3
…

Далее в случае записи на оптический носитель необходимо сформировать ISO-файлы с помощью утилиты mkisofs. Например, для первого диска ISO-файл может быть сформирован с помощью следующей команды:

$ mkisofs -o vol1.iso -D -r -joliet-long -graft-points -path-list vol_1.list
I: -input-charset not specified, using utf-8 (detected in locale settings)
  1.40% done, estimate finish Mon Jun 20 15:43:18 2022
  2.79% done, estimate finish Mon Jun 20 15:43:18 2022
  4.19% done, estimate finish Mon Jun 20 15:43:41 2022

 96.36% done, estimate finish Mon Jun 20 15:43:36 2022
 97.76% done, estimate finish Mon Jun 20 15:43:36 2022
 99.16% done, estimate finish Mon Jun 20 15:43:36 2022
Total translation table size: 0
Total rockridge attributes bytes: 4833
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
358025 extents written (699 MB)

Приведенные параметры утилиты mkisofs позволяют создать ISO-файл с поддержкой длинных имен помещаемых в него файлов, а пути к самим этим файлам взять из переданного файла со списком. Из вывода видно, что файл содержит 699 МБ полезной нагрузки. Сам же файл имеет объем 700 МБ, точно соответствующий заданному ранее:

$ ls -alh *.iso
-rw-rw-r-- 1 alex alex 700M июн 20 15:43 vol1.iso

Теперь можно записать файл на диск. Конечно, это тема другой статьи, тем не менее, не помешает описать последовательность действий. В подавляющем большинстве случаев для записи диска понадобится имя файла устройства привода оптических дисков /dev/sr0. В первую очередь следует проверить работоспособность привода следующим образом:

$ sudo wodim dev=/dev/sr0 -checkdrive
[sudo] пароль для alex:
Device type    : Removable CD-ROM
Version        : 5
Response Format: 2
Capabilities   :
Vendor_info    : 'ASUS '
Identification : 'DRW-24B3ST '
Revision       : '1.00'
Device seems to be: Generic mmc2 DVD-R/DVD-RW.
Using generic SCSI-3/mmc DVD-R(W) driver (mmc_mdvd).
Driver flags   : SWABAUDIO BURNFREE
Supported modes: PACKET SAO

В соответствии с выводом, привод готов к работе. Для записи iso-файла следует передать утилите имя файла привода, путь к ISO-файлу, скорость записи и флаг извлечения лотка после окончания записи:

$ sudo wodim dev=/dev/sr0 speed=4 -eject vol1.iso
wodim: No write mode specified.
wodim: Assuming -tao mode.
wodim: Future versions of wodim may have different drive dependent defaults.
Device type : Removable CD-ROM
Version        : 5
Response Format: 2
Capabilities   :
Vendor_info    : 'ASUS '
Identification : 'DRW-24B3ST '
Revision       : '1.00'
Device seems to be: Generic mmc2 DVD-R/DVD-RW.
Using generic SCSI-3/mmc CD-R/CD-RW driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE FORCESPEED
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Speed set to 1765 KB/s
Starting to write CD/DVD at speed 10.0 in real TAO mode for single session.
Last chance to quit, starting real write in 0 seconds. Operation starts.
Track 01: Total bytes read/written: 733235200/733235200 (358025 sectors).

Первый диск записан. Остальные диски могут быть записаны аналогичным образом.

Сортировка файлов для записи на флеш-накопители

Для записи файлов на флеш-накопитель может быть использован обычный файловый менеджер. Этот факт значительно упрощает задачу — достаточно лишь оптимальным образом рассортировать файлы. К счастью, утилита dirsplit может помочь и в этом случае. Достаточно просто использовать параметр -m:

$ dirsplit -s 2000M -m "10 Years Of Enhanced 2008-2018"
Building file list, please wait...
Calculating, please wait...
....................
Calculated, using 2 volumes.
Wasted: 48787 Byte (estimated, check mkisofs -print-size …)

В данном случае предполагается, что в распоряжении имеется два флеш-накопителя объемом в 2 ГБ каждый. Благодаря параметру -m утилита переместит файлы в отдельные директории вместо создания их списков:

$ du -h vol_*
2,0G vol_1
598M vol_2

Размер первой директории равен ровно 2 ГБ, а во вторую помешены оставшиеся файлы, общий размер которых равен 598 МБ. Теперь несложно скопировать или переместить файлы из данных директорий на флеш-накопители.