У меня есть каталог со слишком большим количеством файлов.
Я хочу сжать первые 5 тысяч файлов в этом каталоге, чтобы они стали file.tar.gz
а затем 5001 - 10000 ... и так далее.
как это сделать?
Используйте 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
Замените биты прописными буквами на то, что вы хотите.
Вы можете создать набор файлов, в котором будут перечислены каждые 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
Этот скрипт постепенно добавляет все файлы в архив и нумерует архив. Переименуйте ARCHIVE_NAME в «5000».
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
Этот скрипт не оптимизирован, поэтому есть несколько правил: