Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 多次无循环地对文件进行Cat_Bash_Shell_Unix - Fatal编程技术网

Bash 多次无循环地对文件进行Cat

Bash 多次无循环地对文件进行Cat,bash,shell,unix,Bash,Shell,Unix,这不是一个家庭作业问题,这是一个旧考试的问题,所以任何给出答案的人都不会导致学术欺诈。对于那些仍然持怀疑态度的人,我只是想知道我可以用什么命令来实现这一点 您有一个名为one_mb的文件,其大小正好为1 mb。您希望从中创建一个大小正好为128 MB的文件。请编写一个shell脚本,最多9行,不包含循环、if语句、递归或任何其他逻辑控制结构。每个命令(包括参数)的长度必须少于100个字符 我开始研究xarg,但找不到一个好的方法来使用它来实现这一点。这里的一个重要提示是它可以“不超过9行”。由于

这不是一个家庭作业问题,这是一个旧考试的问题,所以任何给出答案的人都不会导致学术欺诈。对于那些仍然持怀疑态度的人,我只是想知道我可以用什么命令来实现这一点


您有一个名为one_mb的文件,其大小正好为1 mb。您希望从中创建一个大小正好为128 MB的文件。请编写一个shell脚本,最多9行,不包含循环、if语句、递归或任何其他逻辑控制结构。每个命令(包括参数)的长度必须少于100个字符


我开始研究xarg,但找不到一个好的方法来使用它来实现这一点。

这里的一个重要提示是它可以“不超过9行”。由于2^7=128,您只需将文件大小加倍7倍:

cat one_mb one_mb > two_mb
cat two_mb two_mb > four_mb
...
cat 64_mb 64_mb > 128_mb

对于每个命令100个字符,您可以将其减少很多:

cat one_mb one_mb one_mb one_mb one_mb one_mb one_mb one_mb >mb8
cat mb8 mb8 mb8 mb8 >mb32
cat mb32 mb32 mb32 mb32 >mb128
rm -f mb8 mb32

假设bash,您可以使用一行括号扩展hack:

cat one_mb{,}{,}{,}{,}{,}{,}{,} > 128_mb

不确定这是否算数,但我想到了:

seq 1 128 | xargs -Inone cat one_mb >> 128_mb
没有使用循环,只有一个管道和
xargs

dd oflag=append conv=notrunc if=/dev/zero of=one_mb bs=1MB count=127
这将保留文件内容并添加一组“零”记录,使其达到128MB。做

ls -ltrh one_mb

要检查它是否实际为128MB,否则您可能必须更改“count=127”参数。

我认为有了这些约束就足够了。您可以定义一个以整数为参数的函数。如果大于0,
cat
s删除文件并再次调用相同的函数,但参数减小

然后,您只需使用所需的值调用函数,就完成了

好的ol'递归:)


(很抱歉,对于编码来说太懒了,还有很多其他的有效答案,只是为了避免递归被忘记:)

我认为假设bash是安全的,因为问题有一个
bash
标记。但是,如果我在做标记的话,我很可能会因为我是一个聪明的黑客而被扣掉分数(a**:-)不,不太好,“请写一个shell脚本来做这件事,最多9行,没有循环,如果语句,递归,或者任何其他逻辑控制结构。”真的太晚了,我想“如果语句,递归,等等”是允许的。我的错。我很好奇为什么他们得到的是9个命令,而不是7个。错误的空间,我猜:)可能是:第1行:shebang,第2-8行:上面的代码,第9行:cleanup。。(删除临时文件)这是一种流行的方法。感谢使用xargs,我仍然不知道它是如何工作的,但这是一个非常好的方法。这个简化的命令可能会帮助您更好地理解正在发生的事情:
seq 1 10 | xargs-I{}echo do{}
另外,请查看xargs手册页!谢谢你的简化版。我不打算要求澄清,我遵守RTFM的法律,所以我确实阅读了手册页,但有一些示例有助于澄清,以便更好地描述功能。