다수의 파일에 대한 디렉토리 구조 [닫기]

다수의 파일에 대한 디렉토리 구조 [닫기]

수백만 개의 파일이 있고 파일 이름은 내용의 SHA256 해시입니다. 성능상의 이유로 단일 디렉토리에 저장하고 싶지 않습니다. 내 생각은 SHA256 해시를 기반으로 디렉터리 구조를 구축하는 것입니다. 예를 들어 디렉터리에는 ./A/A/A/A/AAAAAA로 시작하는 모든 파일이 포함됩니다.

예를 들어 해시는 다음과 같습니다.AAAAAFF02F52AA70E57EA3FD67019A7A919D373915AA30393936D9CC

이러한 디렉터리 구조(정의된 하위 디렉터리 수준 - 예: 5 또는 10)를 자동으로 생성할 수 있는 방법이 있습니까? 이 디렉터리 구조를 어떻게 자동으로 만들 수 있나요?

답변1

이는 문제를 해결하는 프레임워크이므로 필요에 맞게 사용자 정의해야 할 수도 있습니다. 여기에는 많은 디버깅 및 테스트 파일 생성이 있습니다. 먼저 테스트 로그를 작성한 다음 스크립트를 작성하세요. 문의를 환영합니다.

귀하의 파일 수는 약 1,600만 개(실제로는 16 * 1024 * 1024)라고 가정합니다. 따라서 첫 번째 수준에 256개 디렉터리, 각 두 번째 수준에 256개 디렉터리(즉, 해당 수준에 65,536개 디렉터리), 디렉터리당 평균 256개 파일이 있는 트리를 선택했습니다. 레벨 4 또는 5 구성표를 원하는 경우 변경 사항은 미미합니다(명확하지 않은지 문의하세요).

나는 awksha256 이름을 mv명령으로 변환하고 파이프로 연결하는 데 사용합니다 bash(끝에서 약 2줄). | bash명령이 예상한 대로 수행된다는 확신이 들 때까지 제거하는 것이 좋습니다 . rm -rf정리하거나 주석 처리하려는 일부 정리 줄( )과 일부 디버깅 줄( 및 )도 있습니다 ls.find

스크립트는 수백만 개의 파일이 모두 있는 디렉터리에서 실행되며 변수는 "Tree"전체 트리가 있는 디렉터리입니다. mv가 각 파일의 디렉토리 항목만 변경하면 되도록 동일한 파일 시스템에 있어야 합니다. 소스와 대상이 다른 파일 시스템에 있으면 mv는 cp처럼 실행되고 프로세스는 "영원히" 실행됩니다.

전체 테스트 실행은 다음과 같습니다.

/home/paul/SandBox/Toys/dirTree
total 8
-rwxr-xr-x 1 paul paul 1841 Dec 12 23:59 myTree
-rw-r--r-- 1 paul paul   32 Dec 12 23:59 myTree.log
Making test files ...
total 544
-rw-r--r-- 1 paul paul  17545 Dec 12 23:59 4E8A34A5010C507ADF81E3D9EEC6330A9E866D3B70857111D3A9DF5C5008BA9D
-rw-r--r-- 1 paul paul  90655 Dec 12 23:59 590A853F3C97C05BB55BBBDFBA988210066807C188E54B78F340F01DD48C0AF5
-rw-r--r-- 1 paul paul   2685 Dec 12 23:59 5B02D3A74A2E4B433D0C7DEE57446460CCE6661E3CE59918B5243B903E3358A6
-rw-r--r-- 1 paul paul   2051 Dec 12 23:59 6F48C65B219CA78B8C7FF03F12A8E27E1A298A541481E9B3C86645B622DCB5B1
-rw-r--r-- 1 paul paul  13545 Dec 12 23:59 8FED5B546352BF30E3B98E7EB8EB916DA5E2814B4227461F01173547263BB257
-rw-r--r-- 1 paul paul 311346 Dec 12 23:59 A8BCA57679FE42C2902D2AE70804C4C93088079B167BC99A7827295FFB34D32E
-rw-r--r-- 1 paul paul   2092 Dec 12 23:59 B31470EC1AF3204CF2327F12A48296F8161B51E3C30679EFA71E65AA882DCED4
-rw-r--r-- 1 paul paul   4602 Dec 12 23:59 C2BFA9351040ABA8F36990D0C3E3E32F70F2E94EF8D05AEDC5EE3B32270953D3
-rw-r--r-- 1 paul paul   7687 Dec 12 23:59 C9FA54EEF557DE7B67B66A145CCC0D65037117F0EDFF8EFCE694B56C4A6F7FEB
-rw-r--r-- 1 paul paul  71752 Dec 12 23:59 D3040C6348CB758498988DA5FAF086666553B27CFB7E591B5E7616C3E8373068
-rwxr-xr-x 1 paul paul   1841 Dec 12 23:59 myTree
-rw-r--r-- 1 paul paul    204 Dec 12 23:59 myTree.log

real    0m1.992s
user    0m2.196s
sys 0m0.296s
Making directory tree ...
/home/paul/SandBox/Toys/dirTree/sha256
256
65536
   262748      4 drwxr-xr-x   2 paul     paul         4096 Dec 12 23:59 ./01/B4
   262811      4 drwxr-xr-x   2 paul     paul         4096 Dec 12 23:59 ./01/F3
   262752      4 drwxr-xr-x   2 paul     paul         4096 Dec 12 23:59 ./01/B8
   262644      4 drwxr-xr-x   2 paul     paul         4096 Dec 12 23:59 ./01/4C

real    3m47.220s
user    0m42.700s
sys 0m32.900s
   135626     72 -rw-r--r--   1 paul     paul        71752 Dec 12 23:59 sha256/D3/04/D3040C6348CB758498988DA5FAF086666553B27CFB7E591B5E7616C3E8373068
   135639    308 -rw-r--r--   1 paul     paul       311346 Dec 12 23:59 sha256/A8/BC/A8BCA57679FE42C2902D2AE70804C4C93088079B167BC99A7827295FFB34D32E
   135641     20 -rw-r--r--   1 paul     paul        17545 Dec 12 23:59 sha256/4E/8A/4E8A34A5010C507ADF81E3D9EEC6330A9E866D3B70857111D3A9DF5C5008BA9D
   133634      4 -rw-r--r--   1 paul     paul         2685 Dec 12 23:59 sha256/5B/02/5B02D3A74A2E4B433D0C7DEE57446460CCE6661E3CE59918B5243B903E3358A6
   135640     92 -rw-r--r--   1 paul     paul        90655 Dec 12 23:59 sha256/59/0A/590A853F3C97C05BB55BBBDFBA988210066807C188E54B78F340F01DD48C0AF5
   135625      8 -rw-r--r--   1 paul     paul         7687 Dec 12 23:59 sha256/C9/FA/C9FA54EEF557DE7B67B66A145CCC0D65037117F0EDFF8EFCE694B56C4A6F7FEB
   135642     16 -rw-r--r--   1 paul     paul        13545 Dec 12 23:59 sha256/8F/ED/8FED5B546352BF30E3B98E7EB8EB916DA5E2814B4227461F01173547263BB257
   135624      4 -rw-r--r--   1 paul     paul         2051 Dec 12 23:59 sha256/6F/48/6F48C65B219CA78B8C7FF03F12A8E27E1A298A541481E9B3C86645B622DCB5B1
   135628      4 -rw-r--r--   1 paul     paul         2092 Dec 12 23:59 sha256/B3/14/B31470EC1AF3204CF2327F12A48296F8161B51E3C30679EFA71E65AA882DCED4
   135630      8 -rw-r--r--   1 paul     paul         4602 Dec 12 23:59 sha256/C2/BF/C2BFA9351040ABA8F36990D0C3E3E32F70F2E94EF8D05AEDC5EE3B32270953D3

real    0m2.118s
user    0m0.528s
sys 0m1.520s

스크립트는 다음과 같습니다.

#! /bin/bash

Tree="sha256"

#.. Fake some test files from man pages, renamed with their own sha256.

mkFile () {

    local Fn
    local Awk='{ printf ("%s\n", toupper ($(NF))); }'

    man -s 1 "${1}" > Man
    Fn=$( openssl dgst -sha256 Man | awk "${Awk}" )
    mv Man "${Fn}"
}

#.. Make a directory tree for the first 4 hex characters of any name,
#.. such that files 7BC12A13... go into ./7B/C1.

mkDirs () {

    local a b c d
    for a in {0..9} {A..F}; do
        for b in {0..9} {A..F}; do
            for c in {0..9} {A..F}; do
                for d in {0..9} {A..F}; do
                    mkdir -p ./${a}${b}/${c}${d}
                done
            done
        done
    done
}

#.. Move all files in the current directory that have sha256-type names
#.. into their appropriate directory.

mvFiles () {

    local Awk='
BEGIN {
    FS = "/";
    cmd = "mv -t \047%s/%s/%s\047 \047%s\047\n";
}
length ($NF) == 64 && $NF ~ /^[[:xdigit:]]*$/ {
    printf (cmd, Tree, substr ($NF, 1, 2), substr ($NF, 3, 2), $NF);
}
'
    awk -v Tree="${Tree}" -f <( printf '%s' "${Awk}" ) -
}

#.. Tests.

    #.. Nothing up my sleeves.
    pwd
    ls -l

    #.. Make some test files.
    [ x ] && time (
        echo "Making test files ..."
        for tx in cut cat ls find wc dd bash awk vi dc; do
            mkFile "${tx}"
        done
        ls -l
    )

    #.. Make a directory tree.
    [ x ] && time (
        echo "Making directory tree ..."
        rm -rf ${Tree}
        mkdir -p ${Tree}
        cd ${Tree} || exit

        pwd
        mkDirs
        ls -d * | wc -l
        ls -d */* | wc -l
        find . -ls | tail -n +1299 | head -n 4
    )

    #.. Move all the local sha256 files into the tree.
    [ x ] && time (
        find . -maxdepth 1 -type f | mvFiles "${Tree}" | bash
        find "${Tree}" -type f -ls
    )

관련 정보