найти подкаталоги и реорганизовать их с помощью нового родительского каталога

Размер блока устройства — это размер блока, с которым система взаимодействует с контроллерами жестких дисков. Если вы хотите прочитать/записать HDD, это происходит так:

  1. Читать:

    1. ЦП -> Контроллер жесткого диска :«Пожалуйста, пришлите мне данные блока 43623626»
    2. Контроллер жесткого диска -> ​​ЦП :"Готово, вот он :0xfce2c0deebed..."
  2. Написать:

    1. ЦП -> Контроллер жесткого диска :«Пожалуйста, запишите эти данные в блок 3452345 :0xfce2c0deebed...»
    2. Контроллер жесткого диска -> ЦП :«готово»

Здесь номер блока означает имя 2354242-го, 512 -байтового блока.

Теоретически можно использовать любой размер блока. Большинство устройств используют блоки по 512 -байт, а некоторые из них, особенно большие жесткие диски, используют блоки по 4096 -байт.Некоторые оптические носители используют блоки размером 2304 байта.

Важно то, что :контроллер блочного устройства ничего не знает о файловой системе на нем. Он может только читать и записывать блоки своего размера на свой носитель. Это то, что драйвер блочного устройства использует для предоставления блочного устройства для ядра :, по сути, одного большого массива байтов. Неважно, как он разбит на разделы или какая фс его использует.

Размер блока файловой системы — это размер блока, в котором структуры данных файловой системы организованы в файловой системе. Это внутренняя особенность файловой системы, нет даже требования использовать блочные -ориентированные структуры данных, а некоторые файловые системы даже не делают этого .

Ext4 чаще всего использует блоки размером 4096 байт.

Кроме того, данные дискового ввода-вывода обычно обрабатываются не непосредственно процессами, а с помощью виртуальной памяти вашей ОС. Он широко использует пейджинг. Размер страницы виртуальной машины обычно составляет 4096 байт (, он может отличаться на процессорах, отличных от -x86 ), он определяется архитектурой ЦП. (Например, более новые процессоры amd64 могут обрабатывать страницы размером 2 МБ, а dec alpha использует страницы размером 8192 байта ).

Для оптимизации ввода-вывода данных лучше всего, если все они являются произведением друг друга, еще лучше, если они равны. Обычно это означает, что :использует блоки fs размером 4096 байт.

Также важно,:если ваше блочное устройство разбито на разделы, разделы должны начинаться/заканчиваться с точного размера страницы . Если вы этого не сделаете, например, ваш sda1 запускается в 17. блоке вашего sda, процессору придется выдать ДВЕ команды чтения/записи для всех операций чтения/записи страницы, потому что физический блок и блок файловой системы будут перекрываться..

В наиболее распространенном сценарии это означает, что :все разделы должны начинаться или начинаться с сектора, кратного 8 (4096 / 512 = 8 ).

Примечание.обычно низкоуровневый блочный ввод-вывод происходит не в операциях чтения/записи одного блока, вместо этого несколько блоков отправляются/принимаются в одной команде. А повторная -организация данных обычно не требует больших накладных расходов, потому что ввод-вывод в память обычно намного быстрее, чем ввод-вывод на блочное устройство. Таким образом, несоблюдение этих правил не приведет к большим накладным расходам.

0
11.02.2021, 22:48
3 ответа
#!/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

Я нашел этот результат, и он достиг цели. для всех, у кого когда-нибудь возникнет подобная проблема, вот код.

Спасибо всем, кто откликнулся и пытался мне помочь

-1
18.03.2021, 22:30

Предполагая, что вы сейчас находитесь в каталоге, где находится 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/

Вы, очевидно, сначала запустите это на копии ваших данных.

1
18.03.2021, 22:30
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, чтобы фактически переместить файлы.

1
18.03.2021, 22:30

Теги

Похожие вопросы