我正在尝试在 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"