Генерация нескольких сотен тестовых файлов в цикле (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 

 

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

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

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

 

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

 #!/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: 

 

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

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

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

 ls -1 | wc -l 

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

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

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