UNIX распаковывает содержимое в несколько папок - PullRequest
3 голосов
/ 29 августа 2010

У меня есть файл tar.gz размером около 13 ГБ.Содержит около 1,2 миллиона документов.Когда я распаковываю это, все эти файлы находятся в одном каталоге, и любые операции чтения из этого каталога занимают много времени.Можно ли как-нибудь разделить файлы из tar на несколько новых папок?

Например: я хотел бы создать новые папки с именем [1,2, ...], каждая из которых содержит 1000 файлов.

Ответы [ 5 ]

4 голосов
/ 29 августа 2010

Это быстрое и грязное решение, но оно выполняет работу в Bash без использования временных файлов.

i=0                                 # file counter
dir=0                               # folder name counter
mkdir $dir                          
tar -tzvf YOURFILE.tar.gz |
cut -d ' ' -f12 |                   # get the filenames contained in the archive
while read filename
    do 
        i=$((i+1))
        if [ $i == 1000 ]           # new folder for every 1000 files
        then
            i=0                     # reset the file counter
            dir=$((dir+1))
            mkdir $dir
        fi
        tar -C $dir -xvzf YOURFILE.tar.gz $filename
    done

То же, что один вкладыш:

i=0; dir=0; mkdir $dir; tar -tzvf YOURFILE.tar.gz | cut -d ' ' -f12 | while read filename; do i=$((i+1)); if [ $i == 1000 ]; then i=0; dir=$((dir+1)); mkdir $dir; fi; tar -C $dir -xvzf YOURFILE.tar.gz $filename; done

В зависимости от настроек вашей оболочки, часть "cut -d '' -f12" для получения последнего столбца (имени файла) вывода содержимого tar может вызвать проблему, и вам придется ее изменить.

Он работал с 1000 файлами, но если у вас есть 1,2 миллиона документов в архиве, попробуйте сначала протестировать его с чем-то меньшим.

1 голос
/ 29 августа 2010

Если у вас GNU tar, вы можете использовать опции --checkpoint и --checkpoint-action. Я не проверял это, но я думаю что-то вроде:

# UNTESTED
cd /base/dir
mkdir  $(printf "dir%04d\n" {1..1500})  # probably more than you need
ln -s dest0 linkname
tar -C linkname ... --checkpoint=1000 \
        --checkpoint-action='sleep=1' \
        --checkpoint-action='exec=ln -snf dest%u linkname ...
1 голос
/ 29 августа 2010
  • Получить список имен файлов с помощью --list
  • Создание файлов, содержащих имена файлов, с помощью grep
  • распаковать только эти файлы, используя --files-from

Таким образом:

tar --list archive.tar > allfiles.txt
grep '^1' allfiles.txt > files1.txt
tar -xvf archive.tar --files-from=files1.txt
0 голосов
/ 29 августа 2010

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

Можете ли вы изменить исходный каталог, чтобы создать там желаемую структуру, а затем скопировать дерево?Если нет, вы можете распаковать файлы, как они есть в файле, а затем обработать этот каталог, используя скрипт для перемещения файлов в нужное расположение.Учитывая количество файлов, это займет некоторое время, но, по крайней мере, это можно сделать в фоновом режиме.

0 голосов
/ 29 августа 2010

Вы можете заглянуть на страницу справочника и посмотреть, есть ли такие варианты. худшее приходит к худшему, просто извлеките нужные файлы (возможно, используя --exclude) и поместите их в свои папки

...