У меня есть папка с 7 491 файлом. Я хотел бы разархивировать их партиями по 100 штук, например
.first 100 files > archive1.tar.gz
files 101-200 > archive2.tar.gz
files 201-300 > archive3.tar.gz
Есть ли способ сделать это через командную строку?
Самая простая опция могла бы состоять в том, чтобы использовать 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
/ цикл.