@Borton1

Как записывать в файл до тех пор пока есть место в нем?

Здравствуйте! У меня есть файл, который я создал truncate -s 100049 test.txt . Он как видно на 100049 байт. Мне нужно записывать в него строки ew=`cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 76` до тех пор пока он не заполнится полностью. Если взять бесконечный цикл и записывать, то когда не хватит места в фале, цикл он остановится?
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
xotkot
@xotkot
хорошо есть и хорошо весьма
Он как видно на 100049 байт.

Мне нужно записывать в него строки ew=`cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 76` до тех пор пока он не заполнится полностью.

то есть, у нас есть символы от A-Z a-z 0-9 каждый из которых занимает 1 байт
нужно записывать строки с 76 символами + 1 символ перевода строки
по итогу получим

100049/77 = 1299 полных строк и немного хвоста
размер хвоста
100049-1299*77 = 26 символов

если всё это перевести в bash-код то получим следующее
#!/usr/bin/env bash

#вводные
FILE=file.txt
S=100049 # общий размер в байтах
s=76   # максимальное количество однобайтовых символов на строку

N=$[S/(s+1)]
n=$[S-N*(s+1)]

echo "Cтрок + хвост = $N + $n"

rm -rf $FILE
for (( i = 0; i < $N; i++ )); do
	cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c $s >> $FILE
	echo >> $FILE
done
cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c $n >> $FILE

echo "Файл записан"
echo "Размер файла $FILE = $(stat -c %s $FILE) байт"

по итогу получим файл с необходимым объёмом данных
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
В файл можно писать до тех пор пока есть место на диске
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Как записывать в файл до тех пор пока есть место в нем?

Это не функционал файловой системы. Порешай такие задачи на уровне прикладного кода. Это не сложно.

Более того. В свете развития современных файловых систем (облачных систем) понятие "свободное место" сильно девальвировало. Его стало сложно посчитать. Оно уже не является уравнением где можно суммировать логический размер файлов и что-то прикидывать. Файлы стали обладать свойством SPARSE - разреженные, COMPRESSED - сжатые, стали иметь хард-линки (несколько внешних имен одного файла).

Во времена 32х битных ОС файлы часто ограничивались в 2Гб сверху. И это и сейчас наблюдается по
устаревшим API для файлов. А после ext4 например размер файлов лимитирован числом exbibyte а это на 12
порядков поболее чем 32х битки. Короче такой размер нам никогда не заполнить ничем.

Кроме того при использовании PIPELINE или канальных устройств само понятие размер файла лишено
смысла. Файл представляет собой трубу через которую с одно стороны пишут а с другой читают
информацию. И это - хорошо. Это гибкость файловой системы которую развивают еще со времен ОС Unix.
Зачем нам эту гибкость ограничивать.
Ответ написан
yarkov
@yarkov
Помог ответ? Отметь решением.
Если взять бесконечный цикл и записывать, то когда не хватит места в фале, цикл он остановится?

Чего ради? Конечно не остановится. Команда truncate всего лишь делает усечение файла до определенного размера, но ничего не мешает писать в него, пока на диске место есть.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
echo "ew=\`cat /dev/urandom \| tr -dc 'A-Za-z0-9' \| head -c 76\`" >./cmd_file.tmp && dd if=./cmd_file.tmp of=./test.txt obs=100049 count=1 && rm ./cmd_file.tmp
Ответ написан
3vi1_0n3
@3vi1_0n3
Учитывая, что изначальный размер определяется размером созданного файла (который в теории может быть другим), я бы начал с получения размера и записыванием ровно такого же объема.
#!/bin/bash
FILE="test.txt"
SIZE=$(stat -c %s $FILE)
{ while [ $(stat -c %s $FILE) -lt $SIZE ]
do
        cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 76
done } | head -c $SIZE > $FILE
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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