2

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

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

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

3 ответа3

0

Используйте 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

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

0

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

Этот скрипт постепенно добавляет все файлы в архив и нумерует архив. Переименуйте 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', извините :-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .