Размер блока устройства — это размер блока, с которым система взаимодействует с контроллерами жестких дисков. Если вы хотите прочитать/записать HDD, это происходит так:
Читать:
Написать:
Здесь номер блока означает имя 2354242-го, 512 -байтового блока.
Теоретически можно использовать любой размер блока. Большинство устройств используют блоки по 512 -байт, а некоторые из них, особенно большие жесткие диски, используют блоки по 4096 -байт.Некоторые оптические носители используют блоки размером 2304 байта.
Важно то, что :контроллер блочного устройства ничего не знает о файловой системе на нем. Он может только читать и записывать блоки своего размера на свой носитель. Это то, что драйвер блочного устройства использует для предоставления блочного устройства для ядра :, по сути, одного большого массива байтов. Неважно, как он разбит на разделы или какая фс его использует.
Размер блока файловой системы — это размер блока, в котором структуры данных файловой системы организованы в файловой системе. Это внутренняя особенность файловой системы, нет даже требования использовать блочные -ориентированные структуры данных, а некоторые файловые системы даже не делают этого .
Ext4 чаще всего использует блоки размером 4096 байт.
Кроме того, данные дискового ввода-вывода обычно обрабатываются не непосредственно процессами, а с помощью виртуальной памяти вашей ОС. Он широко использует пейджинг. Размер страницы виртуальной машины обычно составляет 4096 байт (, он может отличаться на процессорах, отличных от -x86 ), он определяется архитектурой ЦП. (Например, более новые процессоры amd64 могут обрабатывать страницы размером 2 МБ, а dec alpha использует страницы размером 8192 байта ).
Для оптимизации ввода-вывода данных лучше всего, если все они являются произведением друг друга, еще лучше, если они равны. Обычно это означает, что :использует блоки fs размером 4096 байт.
Также важно,:если ваше блочное устройство разбито на разделы, разделы должны начинаться/заканчиваться с точного размера страницы . Если вы этого не сделаете, например, ваш sda1 запускается в 17. блоке вашего sda, процессору придется выдать ДВЕ команды чтения/записи для всех операций чтения/записи страницы, потому что физический блок и блок файловой системы будут перекрываться..
В наиболее распространенном сценарии это означает, что :все разделы должны начинаться или начинаться с сектора, кратного 8 (4096 / 512 = 8 ).
Примечание.обычно низкоуровневый блочный ввод-вывод происходит не в операциях чтения/записи одного блока, вместо этого несколько блоков отправляются/принимаются в одной команде. А повторная -организация данных обычно не требует больших накладных расходов, потому что ввод-вывод в память обычно намного быстрее, чем ввод-вывод на блочное устройство. Таким образом, несоблюдение этих правил не приведет к большим накладным расходам.
#!/usr/bin/env bash
PATH="/folder1/folder2/folder3"
HIERARQUIA=$(/usr/bin/find $PATH/????/????/ -maxdepth 0 -type d | /usr/bin/cut -d "/" -f5-|/usr/bin/sort -s )
OUTPUT=1
for i in $HIERARQUIA
do
SUBPASTAS=$(/usr/bin/find $PATH/$i -maxdepth 1 -type d | /usr/bin/cut -d "/" -f7 |/usr/bin/sort -s)
for a in $SUBPASTAS
do
/usr/bin/mkdir -p $PATH/output$OUTPUT/$i$a
/usr/bin/mv $PATH/$i$a/* $PATH/output$OUTPUT/$i$a
OUTPUT=$(($OUTPUT +1))
done
OUTPUT=1
done
Я нашел этот результат, и он достиг цели. для всех, у кого когда-нибудь возникнет подобная проблема, вот код.
Спасибо всем, кто откликнулся и пытался мне помочь
Предполагая, что вы сейчас находитесь в каталоге, где находится Folder1
:
#!/bin/bash
# Don't even attempt to do something
# if we're in the wrong place.
cd Folder1/Folder2 || exit 1
# Make the shell remove patterns that aren't matched,
# rather than leaving them as they are.
shopt -s nullglob
for dirpath in output/*/*/*/; do
if [[ $dirpath =~ output/(.*)/[^/]*(..)/ ]]; then
# "${BASH_REMATCH[1]}" is something like "0653/3457"
# "${BASH_REMATCH[2]}" is the 2-character suffix, like "01"
newdir=output${BASH_REMATCH[2]}/${BASH_REMATCH[1]}
mkdir -p "$newdir" &&
mv "$dirpath" "$newdir"
fi
done
При этом используется функция сопоставления регулярных выражений bash
для выбора числового суффикса в конце пути к каталогу и создания нового output
имени каталога с его использованием.
Это займет структуру каталогов
.
`-- Folder1/
`-- Folder2/
`-- output/
`-- 0653/
`-- 3547/
|-- 0112945601/
`-- 0112945602/
и превратите его в
.
`-- Folder1/
`-- Folder2/
|-- output/
| `-- 0653/
| `-- 3547/
|-- output01/
| `-- 0653/
| `-- 3547/
| `-- 0112945601/
`-- output02/
`-- 0653/
`-- 3547/
`-- 0112945602/
Пустые каталоги в Folder1/Folder2/output
затем можно было удалить с помощью
find Folder1/Folder2/output -type d -empty -delete
или, используя стандартный find
и игнорируя ошибки из rmdir
при попытке удалить не -пустой каталог,
find Folder1/Folder2/output -depth -type d -exec rmdir {} \; 2>/dev/null
что оставляет
.
`-- Folder1/
`-- Folder2/
|-- output01/
| `-- 0653/
| `-- 3547/
| `-- 0112945601/
`-- output02/
`-- 0653/
`-- 3547/
`-- 0112945602/
Вы, очевидно, сначала запустите это на копии ваших данных.
for dir in Folder1/Folder2/output/*/*/*; do
suffix=${dir:(-2)}
subdir="$(cut -d '/' -f 4- <<<$dir)"
newdir="Folder1/Folder2/output${suffix}/${subdir}"
echo mkdir -p "$newdir"
echo mv "$dir"/* "$newdir"/
done
Если после того, как вы -выполнили это всухую, похоже, что он генерирует команды, которые будут работать для вас, удалите операторы echo
, чтобы фактически переместить файлы.