【问题标题】:How can I create 1000 files that I can use to test a script?如何创建 1000 个可用于测试脚本的文件?
【发布时间】:2011-01-06 06:57:31
【问题描述】:

我想创建 1000 多个带有一些文本的文本文件来测试脚本,如果使用 shell 脚本或 Perl 一次创建文本文件,如何创建这么多。请问谁能帮帮我?

【问题讨论】:

  • 你能创建一个文本文件吗?你能设计一个方案来生成文件名,例如。文件0001,文件002?你能写一个for循环来完成这两个任务吗?你在什么时候卡住了?

标签: python bash shell perl scripting


【解决方案1】:
for i in {0001..1000}
do
  echo "some text" > "file_${i}.txt"
done

或者如果你想使用 Python

for x in range(1000):
    open("file%03d.txt" % x,"w").write("some text")

【讨论】:

  • 您在 Bash 版本中的文件名将从 10 到 1000999。我想您的意思是 echo "some text" > file$file
  • 第一个选项需要 Bash 4 才能使用填充。在早期版本中,您可以指定前导零,但它们不会出现在结果中。
【解决方案2】:
#!/bin/bash
seq 1 1000 | split -l 1 -a 3 -d - file

上面将创建 1000 个文件,每个文件的编号从 1 到 1000。这些文件的名称将从 file000file999

【讨论】:

    【解决方案3】:

    在 Perl 中:

    use strict;
    use warnings;
    
    for my $i (1..1000) {
       open(my $out,">",sprintf("file%04d",$i));
       print $out "some text\n";
       close $out;
    }
    

    为什么是前 2 行?因为它们是很好的练习,所以我什至在像这样的 1-shot 程序中也使用它们。

    问候, 提供

    【讨论】:

    • ...或者你可以use autodie;
    【解决方案4】:

    品种:

    #!/usr/bin/perl
    
    use strict; use warnings;
    use File::Slurp;
    
    write_file $_, "$_\n" for map sprintf('file%04d.txt', $_), 1 .. 1000;
    

    【讨论】:

      【解决方案5】:
      #!/bin/bash
      
      for suf in $(seq -w 1000)
      do
              cat << EOF > myfile.$suf
              this is my text file
              there are many like it
              but this one is mine.
      EOF
      done
      

      【讨论】:

        【解决方案6】:

        我不知道在 shell 或 perl 中,但在 python 中会是:

        #!/usr/bin/python
        
        for i in xrange(1000):
            with open('file%0.3d' %i,'w') as fd:
                fd.write('some text')
        

        我认为它的作用非常简单。

        【讨论】:

        • 我试过你的脚本,但我收到一个错误:./crea.py:4: 警告:'with' 将成为 Python 2.6 文件“./crea.py”中的保留关键字,第 4 行,open('file%0.3d' %i, 'w') as fd: ^ SyntaxError: invalid syntax
        • 尝试从 future 导入 with_statement
        • 那就是from __future__ import with_statement(系统吃掉了ghostdog74的评论中的下划线)。
        【解决方案7】:

        您可以只使用没有外部的 Bash,并且仍然可以填充数字,以便文件名正确排序(如果需要):

        read -r -d '' text << 'EOF'
        Some text for
        my files
        EOF
        
        for i in {1..1000}
        do
            printf -v filename "file%04d" "$i"
            echo "$text" > "$filename"
        done
        

        Bash 4 可以这样做:

        for filename in file{0001..1000}; do echo $text > $filename; done
        

        两个版本都产生像“file0001”和“file1000”这样的文件名。

        【讨论】:

          【解决方案8】:

          只要取任何超过 1000 字节的大文件(对于 1000 个包含内容的文件)。你的电脑上有很多。然后做(例如):

          split -n 1000 /usr/bin/firefox
          

          这很快。

          或者更大的文件:

          split -n 10000 /usr/bin/cat
          

          创建 10000 个文件只用了 0.253 秒

          对于 100k 文件:

          split -n 100000 /usr/bin/gcc
          

          对于 100k 个文件,每个文件大约 5 个字节,只有 1.974 秒

          如果您只想要带有文本的文件,请查看您的 /etc 目录。创建一百万个包含几乎随机文本的文本文件:

          split -n 1000000 /etc/gconf/schemas/gnome-terminal.schemas
          

          1M 文件大约 20.203 秒,每个文件大约 2 个字节。如果你把这个大文件分成 10k 部分,只需要 0.220 秒,每个文件有 256 个字节的文本。

          【讨论】:

          • 唯一的问题是“文件不会是文本文件”。我有一个古老版本的 GNU split 无法识别 -n;它的 BSD (Mac OS X) 版本也不识别它。我只需要升级我的 CoreUtils 安装。
          • 好的,确实如此。如果你想要一百万个小文本文件,只需使用一个大文本文件作为输入。你的电脑里有足够的。例如 /etc/gconf/schemas/gnome-terminal.schemas 如果你想要一个非常大的,它有 2.6 MB。
          【解决方案9】:

          这是一个简短的命令行 Perl 程序。

          perl -E'say $_ $_ for grep {open $_, ">f$_"} 1..1000'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-04
            • 2011-05-14
            • 1970-01-01
            • 2018-12-17
            • 2015-10-16
            • 2020-11-25
            • 2013-09-16
            相关资源
            最近更新 更多