Skip to main content

Генерация нескольких сотен тестовых файлов в цикле (Linux)

Генерация

  • С небольшой датой (501 файл):
for i in {1..501}; do echo $(date +%T_%s) > "${i}.txt" ; echo "$i"; done
# Sample content:
# 12:22:07_1769505327
  • С произвольной неповторяющейся датой (501 файл):
for i in {1..501}; do echo "$(date +%T_%s && openssl rand -base64 24)" > "${i}.txt" ; echo -e "Generated \e[1;34m${i}.txt\e[0m"; done
# Sample content:
# 12:22:07_1769505727
# vCN9MgYoOe1PLQiitXEGhSWqaCcFwqba
  • С уникальными именами и данными (501 файл):
for i in {1..501}; do fname="$(openssl rand -hex 32)"; echo -e "$(date +%T_%s)\n$fname" > "${fname}${i}.txt" ; echo -e "Generated \e[1;34m${fname}${i}.txt\e[0m"; done
# Sample content:
# 12:28:20_1769506100
# 48a2a31880bb565ca40baa3147a35c70786dfcca689de6f453690dd8e9f24d30

image.png

Создание архива

Создание архива одной командой (все txt-файлы в этой директории):

zip -r archive_$(date +%F).zip ./*.txt 

image.png

Бонус: сильно ускоренная версия скрипта:

#!/bin/bash
# Генерация 10k файлов
count=10000
for ((i=1;i<=count;i++)); do
  fname="$(openssl rand -hex 32)"
  printf -v now '%(%T_%s)T' -1           # builtin, без fork()
  printf '%s\n%s\n' "$now" "$fname" "$RANDOM" > "${fname}${i}.txt"
  # логирует реже, иначе терминал станет бутылочным горлышком
  (( i % 500 == 0 )) && echo "Generated $i files..."
done
echo -e "\e[1;34mDONE!\e[0m"

Но здесь есть нюанс: оно работает быстро только на SSD, т.к. каждый файл нужно записать на диск. И тут упор будет уже в скорость чтения/записи. И разница критичная. Вот пример для SSD:

image.png

На HDD этот процесс будет выполняться более чем в 100 раз дольше.

Бонус 2: подсчет кол-ва файлов в директории

Чтобы посчитать кол-во файлов в директории, можно использовать:

ls -1 | wc -l

Но с этой командой есть нюанс: она считает вообще все записи, включая директории. Чтобы посчитать только файлы с расширением .txt можно использовать GREP:

ls -1 | grep '.txt' | wc -l

Разница видна здесь:

image.png