У меня есть каталог, в котором слишком много файлов.
Я хочу сжать первые 5 тысяч файлов в этом каталоге, file.tar.gz
а затем 5001 - 10000... и так далее.
как это сделать?
решение1
Используйте ls для генерации списка имен, а head и tail — для их фильтрации. Вот однострочный код, который делает это в цикле. Вам нужно будет узнать количество файлов в каталоге (ls | wc -l вам его скажет).
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
Замените заглавные буквы на те, которые вам нужны.
решение2
Этот скрипт постепенно добавляет все файлы в архив, и нумерует архив. Переименуйте ARCHIVE_NAME и '5000'.
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
Этот скрипт не оптимизирован, поэтому есть несколько правил:
- При запуске этого скрипта ARCHIVE_NAME# не должен существовать, поэтому, если что-то не получится, выполните команду «rm ARCHIVE_NAME*».
- Запись каталога рассматривается скриптом как 1 запись, но не 'tar'. Tar войдет в каталог и рекурсивно добавит все файлы, и в итоге в архиве может оказаться более 5000 файлов.
- Сжатые архивы не могут быть обновлены, я пропустил '-z', извините :-)
решение3
Вы можете создать набор файлов, которые перечисляют каждые 5000 имен файлов, и использовать их с аргументами -T для tar. Что-то вроде этого может сработать:
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done