Tar Gzip Every n файлов в каталоге

У меня есть папка с 7 491 файлом. Я хотел бы разархивировать их партиями по 100 штук, например

.
first 100 files > archive1.tar.gz
files 101-200 > archive2.tar.gz
files 201-300 > archive3.tar.gz

Есть ли способ сделать это через командную строку?

2
задан 6 July 2014 в 18:09

1 ответ

Самая простая опция могла бы состоять в том, чтобы использовать split команда в сочетании с find и tar -T/--files-from опция:

find ... -type f -print0 | 
  split -t '\0' -l 100 -d --filter 'tar czf archive-$FILE.tar.gz --files-from=- --null'

split будет также заботиться об установке имен файлов с последовательной нумерацией ( -d опция устанавливает пронумерованные имена файлов вместо обычных алфавитных).

С комбинацией find и xargs, Я не мог найти способ получить надежную последовательную нумерацию архивов, таким образом, я использовал uuidgen:

find <directory> -type f -print0 | xargs -n 100 -0 sh -c 'tar -czf archive-$(uuidgen).tar.gz "$@"' _

Или Вы могли использовать циклы удара:

count=1
N=100
find <directory> -type f -print0  | 
{
while true
do
    files=()
    for ((i=0;i<N;i++))   # Add N filenames to the `files` array
    do
        IFS= read -d '' -r file
        files+=("$file")
    done
    ((count++))
    tar -czf archive-$count.tar.gz "${files[@]}"
done
}

Предположение во всех этих командах - это find не выполняется в текущем каталоге. Иначе Вы могли бы закончить тем, что смолили файл tar. Если необходимо выполнить его в текущем каталоге, то я предлагаю сохранить имена файлов в файл и затем считать имена файлов из того файла для split/xargs/ цикл.

7
ответ дан 6 July 2014 в 18:09

Другие вопросы по тегам:

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