Это быстрое и грязное решение, но оно выполняет работу в 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 миллиона документов в архиве, попробуйте сначала протестировать его с чем-то меньшим.