【问题标题】:Cat a file Multiple times Without A Loop在没有循环的情况下多次 Cat 文件
【发布时间】:2013-03-20 02:48:46
【问题描述】:

这不是一个家庭作业问题,这是一个旧考试的问题,所以任何给出答案的人都不会导致学术不诚实。对于那些仍然持怀疑态度的人,我只是在寻找我可以为此使用什么命令。

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

我开始研究 xarg,但找不到使用它的好方法。

【问题讨论】:

    标签: bash shell unix


    【解决方案1】:

    不确定这是否重要,但我想到了这一点:

    seq 1 128 | xargs -Inone cat one_mb >> 128_mb
    

    没有使用循环,只是一个管道和xargs

    【讨论】:

    • 感谢您使用 xargs,仍然看不到它是如何工作的,但这是一个非常可爱的 oneliner
    • 这个简化的命令可能会帮助您更好地理解发生了什么:seq 1 10 | xargs -I{} echo Doing {} 另外,请查看 xargs 手册页!
    • 感谢您提供简化版。我不打算要求澄清,我遵守 RTFM 的法律,所以我确实阅读了手册页,但有示例有助于澄清,而不是对功能的高级描述。
    【解决方案2】:

    假设 bash,您可以使用单行大括号扩展技巧:

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

    【讨论】:

    • 我认为假设 bash 可能是安全的,因为这个问题有一个 bash 标签。但是,如果我要标记这个,我很可能会因为是一个聪明的人而扣分 :-) 不,不是真的,很好的 hack。
    【解决方案3】:

    这里的重要提示是它可以“不超过 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
    

    【讨论】:

    • 我很好奇为什么给了他们 9 个命令,而不是 7 个。我猜是有错误的余地 :)
    • 可能是:第 1 行:shebang,第 2-8 行:上面的代码,第 9 行:清理..(删除临时文件)
    • 这是流行的方法。
    【解决方案4】:

    每个命令 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
    

    【讨论】:

      【解决方案5】:
      dd oflag=append conv=notrunc if=/dev/zero of=one_mb bs=1MB count=127
      

      这将保留文件内容并添加一堆“零”记录,使其大小为 128 MB。做

      ls -ltrh one_mb
      

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

      【讨论】:

        【解决方案6】:

        我认为只要有你的限制就足够了。您可以定义一个将整数作为参数的函数。如果大于 0,cats 文件并再次调用相同的函数,但参数减少。

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

        很好的递归:)

        (抱歉,懒得写代码了,还有很多其他可行的答案,只是想避免递归被遗忘:))

        【讨论】:

        • "请编写一个 shell 脚本来执行此操作,最多 9 行和 no 循环、if 语句、recursion 或任何其他逻辑控制结构。”
        • 真的太晚了,我认为“if 语句、递归等”是允许的。我的错。
        猜你喜欢
        • 1970-01-01
        • 2015-11-30
        • 2021-02-04
        • 2021-11-12
        • 1970-01-01
        • 2013-09-03
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        相关资源
        最近更新 更多