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

1558

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

Я хочу сжать сначала 5 тысяч файлов в этом каталоге, file.tar.gzа затем 5001 - 10000 ... и так далее

как это сделать?

2
Первые пять тысяч названы иначе, чем следующие? 13 лет назад 0
да. совсем другое имя. 13 лет назад 0
Вы пытались использовать регулярное выражение, чтобы соответствовать первым 5k? Тогда, может быть, простой Perl или Python скрипт, чтобы сделать работу ноги 13 лет назад 0

3 ответа на вопрос

0
Optimal Cynic

Используйте ls для генерации списка имен и заголовка и хвоста для их фильтрации. Вот одна строка, которая делает это в цикле. Вам нужно знать количество файлов в каталоге (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 

Замените биты прописными буквами на то, что вы хотите.

Бесполезное использование премии ls идет к ... Hello71 12 лет назад 0
0
karatedog

Этот скрипт постепенно добавляет все файлы в архив и нумерует архив. Переименуйте 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', извините :-)
вместо этого вы можете использовать `for i in *`. Wuffers 12 лет назад 0
0
Shannon Nelson

Вы можете создать набор файлов, в котором будут перечислены каждые 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 

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