"tar -czf" для первых 5 тысяч файлов

"tar -czf" для первых 5 тысяч файлов

У меня есть каталог, в котором слишком много файлов.

Я хочу сжать первые 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

Этот скрипт не оптимизирован, поэтому есть несколько правил:

  1. При запуске этого скрипта ARCHIVE_NAME# не должен существовать, поэтому, если что-то не получится, выполните команду «rm ARCHIVE_NAME*».
  2. Запись каталога рассматривается скриптом как 1 запись, но не 'tar'. Tar войдет в каталог и рекурсивно добавит все файлы, и в итоге в архиве может оказаться более 5000 файлов.
  3. Сжатые архивы не могут быть обновлены, я пропустил '-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

Связанный контент