尝试将文件大小增加一倍失败

尝试将文件大小增加一倍失败

我正在尝试在 ramdisk 上创建一个大型随机文件,以便进行一些测试。我已经创建了 ramdisk 和我的起始文件(来自 /dev/urandom),没有遇到太多麻烦,但我无法增加它的大小(我希望我可以将其 cat 到自身中以将其加倍直到磁盘已满),我不确定为什么。我希望有人能告诉我我忽略了什么。

首先,这个文件肯定存在:

$ 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

答案1

您尝试执行的命令存在两个明显的问题:

首先,您只能sudo通过-s选项传递一个简单的命令。为了运行带有 I/O 重定向的命令行,您必须明确调用 shell,例如:

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

请注意:我已仔细阅读了您的问题并按说明进行了回答。如果您还有其他未说明的问题/事项,则它们就是未说明的,因此无法回答。

这里的问题是,您正试图打开一个名为的文件

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 两个副本的 ramfile.out。

您还可以通过 sudo 以 root 身份执行此操作。您需要注意的另一件事是,输出重定向的目标是使用原始用户的安全上下文打开的

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

因此,您需要确保使用 sudo 的用户对目标文件具有适当的写权限。

答案3

您无法将文件复制到其自身上。但是,您可以使用以下任何一种方法来实现您想要的效果。

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"

相关内容