Быстрый и легкий способ.
output="$(ls -td control.tk input.scs 2> /dev/null|head -1)"
Однако я бы использовал это только в том случае, если вы можете убедиться, что файлы не содержат забавных символов, таких как новые строки или пробелы. Если вы можете гарантировать, что имена файлов не содержат забавных символов, то синтаксический анализ ls
вполне безопасен.
Если я правильно вас понял, вы ищете что-то вроде:
echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done
В результате будет создан файл с 22 повторениями «тестовой строки». Если вам нужен файл определенного размера, вы можете использовать что-то вроде этого (в Linux). 1024 - это один килобайт:
while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done
Лично, когда я хочу создать большой файл, я использую два файла и переключаю один в другой. Вы можете повторять процесс до тех пор, пока не достигнете желаемого размера (здесь 1 МБ):
echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do
cat file >> newfile
cat newfile >> file
done
Обратите внимание, что это решение часто превышает желаемый размер, потому что, если размер файла меньше лимита, все будет снова в нем.
Наконец, если все, что вам нужно, это файл желаемого размера и он не должен содержать что-либо, вы можете использовать truncate
:
truncate -s 1M file
Это будет продолжаться, пока вы не нажмете CTRL-C:
да Это материал, который я хочу поместить в свой файл ... >> dummy.txt
Но будьте осторожны, потому что вы можете получить сотни тысяч строк в секунду ...
От человек да
:
yes - output a string repeatedly until killed
Вы можете создать большой файл в Solaris, используя:
mkfile 10g /path/to/file
Другой способ, который работает в Solaris (и Linux):
truncate -s 10g /path/to file
Также можно использовать:
dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Передав содержимое /dev/urandom
в head
, вы можете перенаправить вывод в файл, так :
cat /dev/urandom | head --bytes=100 >> foo.bar
Вы получите файл со 100 байтами мусора.
echo "This is just a sample line appended to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
cat dummy.txt >> bigfile
cat bigfile > dummy.txt
(( i++ ))
done
Тот же эффект, что и ваш скрипт Windows, но в bash вы не можете напрямую связать файл с самим собой.
yes "Some text" | head -n 100000 > large-file
С csh
/ tcsh
:
repeat 10000 echo some test > large-file
С zsh
:
{repeat 10000 echo some test} > large-file
В системах GNU см. Также:
seq 100000 > large-file
Или:
truncate -s 10T large-file
(создает Разреженный файл размером 10 ТиБ (очень большой, но не занимает места на диске)) и другие альтернативы, обсуждаемые в «Создать тестовый файл с большим количеством нулевых байтов» .
Выполнение cat file >> file
было бы плохой идеей.
Во-первых, он не работает с некоторыми реализациями cat
, которые отказываются читать файлы, совпадающие с их выходным файлом. Но даже если вы обойдете это, выполнив cat file | cat >> file
, если file
больше, чем внутренний буфер cat
, это приведет к тому, что cat
будет работать в бесконечном цикле, как если бы закончить чтение данных, которые он написал ранее.
В файловых системах, поддерживаемых вращающимся жестким диском, это было бы также довольно неэффективно (после достижения размера, превышающего размер, который мог бы быть кэширован в памяти), так как диск должен был бы перемещаться вперед и назад между местом, где читать данные, и то, куда это писать.
Самый быстрый способ создания большого файла в системе Linux - fallocate
:
sudo fallocate -l 2G bigfile
fallocate
манипулирует файловой системой и по умолчанию не записывает в секторы данных, и поэтому чрезвычайно быстр. Недостатком является то, что его нужно запускать от имени root.
Запуская ее последовательно в цикле, вы можете заполнить самую большую файловую систему за считанные секунды.
Из man fallocate
fallocate используется для манипулирования выделенным дисковым пространством для файла. файла, либо для деаллокации, либо для предварительной аллокации.
Для файловых систем, поддерживающих системный вызов fallocate, предварительное распределение выполняется быстро путем выделения блоков и пометки их как неинициализированных, не требуя ввода-вывода для блоков данных блоков. Это намного быстрее, чем создание файла путем заполнения его нулями.
Поддерживается для XFS (с Linux 2.6.38), ext4 (с Linux 3.0), Btrfs (с Linux 3.7) и tmpfs (с Linux 3.5).