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的法律,所以我确实阅读了手册页,但有一些示例有助于澄清,以便更好地描述功能。