Вы должны пропустить первую строку:
awk 'BEGIN { FS=":"
printf "%-10s %-35s %-55s\n", "RANK", "PERFORMER","SONG"
print "=====================================================================\n"}
FNR==1{next}{printf "%-10s %-35s %-55s\n", $1, $3, $2}' songs
Если вас не волнует порядок вывода, попробуйте:
$ awk -F':' 'FNR==1{next}{a[$5]+=1} END{for(i in a){print i,a[i]}}' songs
Soul 1
Classic 6
Pop 1
Файловая система должна иметь определенный максимальный размер. Но поскольку файловая система -как -файл может быть разреженной , этот размер может быть произвольным числом, которое не имеет большого отношения к тому, сколько места занимает файловая система -как -. файл занимает базовую файловую систему.
Если вы можете согласиться с установкой произвольного ограничения максимального размера (, которое может быть намного больше, чем фактический размер базовой файловой системы )для файловой системы -как -файла, вы можете создать разреженный файл и файловая система на нем прямо сейчас:
/tmp# df -h.
Filesystem Size Used Avail Use% Mounted on
<current filesystem> 20G 16G 3.0G 84% /
/tmp# dd if=/dev/null bs=1 seek=1024000000000 of=testdummy
0+0 records in
0+0 records out
0 bytes copied, 0.000159622 s, 0.0 kB/s
/tmp# ll testdummy
-rw-r--r-- 1 root root 1024000000000 Feb 19 08:24 testdummy
/tmp# ll -h testdummy
-rw-r--r-- 1 root root 954G Feb 19 08:24 testdummy
Здесь я создал файл, который намного больше, чем файловая система, в которой он хранится...
/tmp# du -k testdummy
0 testdummy
...но пока он вообще не занимает места на диске (за исключением индексного дескриптора и, возможно, некоторых других метаданных ).
Было бы вполне возможно losetup
создать на нем файловую систему и начать ее использовать. Каждая операция записи, которая фактически записывает данные в файл, приведет к увеличению требований к пространству для файла. Другими словами, в то время как размер файла, указанный в ls -l
, все время будет оставаться таким произвольным огромным числом, фактическое пространство, занимаемое файлом на диске, как сообщается в du
, будет расти.
И если вы монтируете файловую систему -как файл -с параметром монтирования discard
, сжатие также может работать автоматически:
/tmp# losetup /dev/loop0 testdummy
/tmp# mkfs.ext4 /dev/loop0
/tmp# mount -o discard /dev/loop0 /mnt
/tmp# du -k testdummy
1063940 testdummy
/tmp# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 938G 77M 890G 1% /mnt
/tmp# cp /boot/initrd.img /mnt
/tmp# du -k testdummy
1093732 testdummy
/tmp# rm /mnt/initrd.img
/tmp# du -k testdummy
1063944 testdummy
Для автоматического сжатия требуется:
1. )что тип файловой системы файловой системы -как -файл поддерживает discard
параметр монтирования (, чтобы драйвер файловой системы мог сообщить базовой системе, какие блоки могут быть освобождены)
2. )и что тип файловой системы нижележащей файловой системы поддерживает "перфорирование отверстий", т.е.системный вызов fallocate(2)
с опцией FALLOC_FL_PUNCH_HOLE
(, чтобы базовой файловой системе можно было приказать пометить некоторые из ранее -выделенных блоков файловой системы -как файл -как разреженные блоки)
3. )и что вы используете версию ядра 3.2 или более позднюю, так что поддержка петлевых устройств имеет для этого необходимую инфраструктуру.
https://outflux.net/blog/archives/2012/02/15/discard-hole-punching-and-trim/
Если вас устраивает менее быстрое сжатие, вы можете просто периодически запускать fstrim
в файловой системе -как файл -вместо использования опции монтирования discard
. Если базовая файловая система очень загружена, отказ от немедленного сжатия может помочь свести к минимуму фрагментацию базовой файловой системы.
Проблема с этим подходом заключается в том, что если базовая файловая система переполняется, это не будет корректно обрабатываться. Если в базовой файловой системе больше нет места, файловая система -как файл -начнет получать ошибки при попытке заменить разреженные «дыры» фактическими данными, даже если файловая система -как файл -будет казаться, что осталась неиспользованная емкость.
Файловые системы создаются для обработки фиксированного объема дискового пространства. Некоторые файловые системы поддерживают увеличение, меньше поддерживают сжатие, но не по запросу без вмешательства пользователя. Ответ на вопрос, который вы упомянули, говорит, что вам нужно изменить размер вручную.
Конечно, то, что можно сделать вручную, также можно сделать автоматически, но для этого потребуется поддержка со стороны ядра, чтобы в случае переполнения файловой системы оно не сообщало о том, что файловая система заполнена, а увеличивало файловую систему. Кроме того, вы хотите автоматически сжимать файловую систему при удалении файла, это потенциально очень трудоемкая операция, поскольку вам может потребоваться перемещать данные, чтобы освободить место в конце файловой системы.
Файловая система, созданная специально для этой задачи, могла бы просто выделять блоки в конце при увеличении и освобождать блоки в середине при сжатии, но, похоже, никто не хочет создавать такую файловую систему. Конечно, вы вольны сделать это сами.
Динамические диски VirtualBox отличаются друг от друга. Они создаются с фиксированным максимальным размером, просто они не сразу занимают этот объем дискового пространства. Блок выделяется, как только данные записываются в этот блок, и он не уменьшается, потому что этот блок не используется.
Использование разреженного файла + циклического устройства + TRIM, как в принятом, — это хорошо и нормально, однако я не совсем уверен, что у вас не проблема XY :почему бы просто не использовать подкаталог/поддерево? Он будет увеличиваться и уменьшаться по мере необходимости, и вы также можете монтировать в другом месте с помощью mount --bind
или NFS ;-)
I am also aware of existing systems that do something similar: specifically VirtualBox's Dynamic Disks. If there is some way of using those - or something akin to them - without actually running a virtual machine, I would also be happy with that.
С qemu-ndb
вы также можете использовать в хост-системе любой образ диска, поддерживаемыйqemu
:
# modprobe nbd
# qemu-nbd --discard=unmap -c /dev/nbd1 image.qcow2
# kpartx -a /dev/nbd1
# mount /dev/mapper/nbd1p1 /mount/point
...
# fstrim -v /mount/point
...
# qemu-nbd -d /dev/nbd1
Образы qcow2 Qemu не только увеличиваются и уменьшаются для размещения данных, но также поддерживают моментальные снимки и «разные» изображения.