如何使用终端创建多个文件?

我一直在学习编写一本非常酷的C入门书,我将每一个例子和任务都写下来,这样我就可以用心去学习语法。 到目前为止,我手动完成了每个文件,但是点击,命名和保存变得筋疲力尽。

我需要一种方法来创建多个文件,如bspl0001.cbspl0002.cbspl0003.c等,并将它们保存在目录“learning_c”或其他东西中。

我是Ubuntu / Linux的菜鸟,老老实实只能通过VirtualBox运行它,因为IDE Geany很容易设置。 因此,我真的不知道终端是如何工作的。

您可以使用以下命令执行此操作:

 mkdir learning_c cd learning_c touch bspl{0001..0003}.c 

阐释:


  • mkdir learning_c

    • 这将在当前文件夹中创建一个名为learning_c的文件夹
    • 当前文件夹通常是您的主文件夹,也称为~
    • 您可以使用cd命令更改当前目录(即cd Desktop
  • cd learning_c

    • 是的,您可以猜到,您正在输入新创建的文件夹
  • touch bspl{0001..0003}.c

    • touch是一个创建空文件和修改时间戳的工具,我们正在创建空文件。
    • touch myfile将创建一个名为myfile的空文件。
    • 随后的丑陋代码( bspl{0001..0003}.c )称为大括号扩展 。 这是bash shell的一个很棒的function,它允许创建任意字符串组合的长列表。 你可以在这里了解更多。 在这种情况下,您将制作一长串参数,以便将其传递给touch 。 你也可以做同样的长期:

       touch bspl0001.c bspl0002.c bspl0003.c 
    • 你可以改变文件的数量,如果你想要12个文件,你可以运行bspl{0001..0012}.c

    • 前导零( 0012而不是12 )用于使输出零填充4位数。

使用快捷键组合创建正确编号(下一个)文件

为什么一次创建所有文件? 缺点是你将有很多空的和未使用的文件。 我实际使用的是:按下一个组合键:

  1. 有一个脚本在我的代码目录中看到什么应该是“下一个”文件,
  2. 创建正确命名的文件(包括shebang)和
  3. 在我的编辑器中打开新文件(在我的情况下是空闲)。

一键一键。 这样你可以防止很多(仍然)未使用的文件; 只有在您需要时才会创建文件。

下面的简化版本(未运行第3步)。 在每个按键上,它将创建一个正确编号的文件,如:

 bspl0001.c, bspl0002.c, bspl0003.c etc 
 #!/usr/bin/env python3 import os #--- set your code directory below dr = "/path/to/your/coding_files" #--- set the desired (base) name extension and shebang below (leave it ""if you don't want an automatically set shebang) name_initial = "bspl" extension = ".c" shebang = "" #--- existing = os.listdir(dr) n = 1 while True: file = dr+"/"+name_initial+str(n).zfill(4)+extension if os.path.exists(file): n = n+1 else: with open(file, "wt") as out: out.write(shebang) break 

如何使用

  1. 将脚本复制到空文件中
  2. 在head部分中,设置目录的路径(可选:更改基本名称和/或扩展名,shebang)。
  3. 将脚本另存为create_empty.py
  4. 从快捷方式运行脚本:系统设置>键盘>自定义快捷方式。 添加命令:

     python3 /path/to/create_empty.py 

您可以使用以下python代码,您可以修改它以满足您的需要。
使用文件名filecreator.py保存以下代码

 #!/usr/bin/env python import os import subprocess work_path = os.path.abspath(os.path.dirname(__file__)) if not os.path.exists("learning_c"): os.mkdir("learning_c") os.chdir(os.path.expanduser(work_path+"/learning_c")) n = 10 #put the number as you wish for i in range(n): subprocess.call(['touch', "bsdl"+str(i).zfill(4)+".c"]) 

然后使用以下命令执行它:

 python filecreator.py 

bash方式很好,但是如果你正在使用不支持花括号扩展的shell呢? touch file{1..10}mksh上对我mksh 。 无论shell如何,这里有三种替代方法。

以次

更加与shell无关的方法是组合seq命令以生成使用printf选项格式化的数字序列,并将其传递给xargs命令。 例如,

 $ ls -l total 0 $ seq -f "%04.0f" 10 | xargs -I "{}" touch bspl"{}".c $ ls bspl0002.c bspl0004.c bspl0006.c bspl0008.c bspl0010.c bspl0001.c bspl0003.c bspl0005.c bspl0007.c bspl0009.c 

Perl的

当然,Perl是一个相当广泛的* nix工具,也可以做到这一点。 我们这里具体的一行命令如下:

 perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5 

实际上,这里发生的是我们指定3个命令行参数:文件名前缀,起始索引和结束索引。 然后我们使用do { } for $ARGV[1] .. $ARGV[2]来迭代特定范围的数字。 比如说, $ARGV[1]为5而$ARGV[2]为9,我们将迭代超过5,6,7,8和9。

大括号内的每次迭代会发生什么? 我们使用$_指定每个数字,并使用sprintf()函数创建一个字符串m,它拼接前缀(第一个命令行参数, $ARGV[0] )和给定的数字,但用4个零填充数字(由printf style of format, %04d part完成),并附加.c后缀。作为每次迭代的结果,我们组成一个名称,如bspl0001.c

open(my $fh, ">", $var);close($fh)有效地充当touch命令,创建具有指定名称的文件。

虽然略长,但它表现得相当不错,与Jacob Vlijm的python脚本类似。 如果需要,它也可以转换为脚本以便于阅读,如下所示:

 #!/usr/bin/env perl use strict; use warnings; for my $i ( $ARGV[1] .. $ARGV[2] ) { my $var=sprintf("%s%04d.c",$ARGV[0],$i ); open(my $fh, ">", $var) or die "Couldn't open " . $var ; close($fh) or die "Couldn't close " . $var ; } 

让我们测试一下。 首先是单线:

 $ ls -l total 0 $ perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5 $ ls -l total 0 -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0001.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0002.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0003.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0004.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:36 bslp0005.c 

现在脚本:

 $ ls -l total 4 -rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl* $ ./touch_range.pl bspl 1 5 $ ls -l total 4 -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0001.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0002.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0003.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0004.c -rw-rw-r-- 1 xieerqi xieerqi 0 2月 5 23:58 bspl0005.c -rwxrwxr-x 1 xieerqi xieerqi 244 2月 5 23:57 touch_range.pl* 

AWK

另一种方法是使用awk ,运行for循环,重定向到特定文件。 该方法类似于带有命令行参数的perl one-liner。 虽然awk主要是一个文本处理实用程序,但它仍然可以做一些很酷的系统编程。

 $ awk 'BEGIN{for(i=ARGV[2];i<=ARGV[3];i++){fd=sprintf("%s%04d.c",ARGV[1],i); printf "" > fd;close(fd)}}' bslp 1 5