Попытка удвоить размер файла не удалась [закрыто]

Я пытаюсь создать большой случайный файл на ramdisk, чтобы провести некоторые тесты. Я создал ramdisk и свой начальный файл (из / dev / urandom) без особых проблем, но у меня возникли проблемы с увеличением его размера (я надеялся, что смогу просто вложить его в себя, чтобы удвоить его, пока диск не будет заполнен ), и я не знаю почему. Я надеюсь, что кто-нибудь скажет мне, что я упускаю из виду.

Во-первых, файл определенно там:

$ ls -la /mnt/ramdisk/ramfile
-rw-r--r-- 1 root root 163840 Nov 22 11:07 /mnt/ramdisk/ramfile

Во-вторых, я пытаюсь использовать cat, чтобы удвоить его размер, но это не удалось:

$ sudo -s "cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile"
/bin/bash: cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile: No such file or directory

Так что, я думаю, я что-то неправильно понимаю, потому что ожидал, что это сработает. Я также дважды пытался перенести начальный файл в другой файл, но получил аналогичную ошибку.

На случай, если это уместно, я создал файл следующим образом:

sudo dd if=/dev/urandom of=/mnt/ramdisk/ramfile bs=16384 count=10

Причина, по которой я хочу это сделать, - я обнаружил, что urandom довольно медленно читается (даже на сильно перегруженном сервере), и я хочу убедиться, что скорость чтения из этого случайного файла не является узким местом.

РЕДАКТИРОВАТЬ:

Версии-

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
cat (GNU coreutils) 8.21
Ubuntu 14.04 x86_64
-3
задан 22 November 2015 в 13:42
3 ответа

Есть две различные проблемы с командой, которую вы попытались:

Во-первых, вы можете передать только простую команду в sudo через -s ] вариант. Чтобы запустить командную строку с перенаправлением ввода-вывода, вы должны явно вызвать оболочку, например:

sudo bash -c "cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile"

Это исправит сообщение об ошибке, о котором вы сообщили, но приведет к другому:

cat: /mnt/ramdisk/ramfile: input file is output file

Что обнажает вторую проблему: cat запрограммирован так, чтобы предотвращать именно то, что вы его просите, а именно присоединение файла к самому себе. Вы можете обмануть его, вставив в конвейер второго cat , убрав первого с трека:

sudo bash -c "cat /mnt/ramdisk/ramfile | cat >> /mnt/ramdisk/ramfile"

Обратите внимание, что поведение этой команды будет зависеть от начального размера файла / mnt / ramdisk / ramfile . Если файл достаточно мал, чтобы поместиться в буфер команды cat , он будет добавлен к самому себе только один раз, увеличивая его размер вдвое. Если он больше, чем сумма всех буферов в конвейере, он будет бесконечно добавляться к себе снова и снова, пока диск не будет заполнен. Если его размер находится между этими двумя пределами, поведение не является детерминированным.

2
ответ дан 5 December 2019 в 21:53

Обратите внимание: я внимательно прочитал ваш вопрос и ответил на него, как указано. Если у вас есть другие вопросы / проблемы, которые вы не указали, то они точно не сформулированы и поэтому на них невозможно ответить.

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

cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile

, и bash не может его найти. Это вызвано тем, что вы цитируете все, и что касается bash, это всего лишь аргумент командной строки для его выполнения.

Так что это довольно легко решить

cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile

К сожалению, это не сработает, поскольку кошка умна

cat: /mnt/ramdisk/ramfile: input file is output file

С помощью cat вы берете несколько входов и добавляете их к выходу

cat  /mnt/ramdisk/ramfile /mnt/ramdisk/ramfile >/mnt/ramdisk/ramfile.out

создаст ramfile.out, который был двумя копиями ramfile.

Вы также делаете это как root через sudo. Еще одна вещь, о которой вам нужно знать, это то, что цель перенаправления вывода открывается с использованием контекста безопасности исходного пользователя

sudo cat /mnt/ramdisk/ramfile /mnt/ramdisk/ramfile > /mnt/ramdisk/ramfile.out
-bash: /mnt/ramdisk/ramfile.out: Permission denied

, поэтому вам необходимо убедиться, что пользователь, от которого вы выполняете sudo, имеет подходящие права на запись в целевой файл.

1
ответ дан 5 December 2019 в 21:53

Вы не можете скопировать файл на себя. Однако вы можете выполнить то, что хотите, с помощью любого из следующих действий:

sudo cat $TESTFILE/ramfile $TESTFILE/ramfile > $TESTFILE/ramfile2; mv  $TESTFILE/ramfile2 $TESTFILE/ramfile

или

sudo bash -c "cat $TESTFILE/ramfile $TESTFILE/ramfile > $TESTFILE/ramfile2; mv  $TESTFILE/ramfile2 $TESTFILE/ramfile"
0
ответ дан 5 December 2019 в 21:53

Теги

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