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


46

我一直在用一本非常酷的C语言入门书来学习编程,我写下了每个示例和任务,这样我就可以真正地学习语法。到目前为止,我一直手动处理每个文件,但是单击,命名和保存都用尽了。

我需要一种方法来创建多个文件,如bspl0001.cbspl0002.cbspl0003.c,等,并将其保存在目录“learning_c”什么的。

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

编辑我只是在我的这个旧帐户中找到了自己,并为为什么我要内心学习代码语法而摇了摇头。有趣的是,我的CS /数学BSc学习几乎完成了。非常感谢您事后的帮助!


1
为什么要一次创建所有文件?我实际使用的是:按下组合键以1.在我的代码目录中看到应该是“下一个”文件,2.创建正确命名的文件(包括shebang),然后在我的编辑器中将其打开3。闲)。一键操作。这样,您可以防止大量(仍)未使用的文件。
Jacob Vlijm

Answers:


77

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

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)之后的丑陋代码称为大括号扩展。这是bashShell的一项重要功能,可让您创建任意字符串组合的长列表。您可以在Bash Hackers Wiki中了解有关此内容的更多信息。在这种情况下,您将制作一长串将传递给的参数touch。您还可以使用其长等效项:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • 您可以更改文件数:如果需要12个文件,则可以运行 bspl{0001..0012}.c

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

4
或者,要保存一些击键,touch bspl000{1..3}.c
Reid 2015年

1
@Reid:如果Herios想要10个或更多文件会怎样?
Helio

3
对于那些想要创建具有相同扩展名的文件列表的人touch {test,tes2,tes3}.js
Rick

1
@Rick:我不回答吗? ;-)。您的代码可以简化:touch tes{t,2,3}.js
Helio 2015年

1
并且您也可以在一个命令行中执行此操作:$ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c。“;” 将帮助您添加将依次执行的命令。
Pavlos Theodorou

4

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

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

  1. 在我的代码目录中看到一个脚本,该脚本应该是“下一个”文件,
  2. 创建正确命名的文件(包括shebang)并
  3. 在编辑器中打开新文件(以Idle为例)。

一键操作。这样,您可以防止大量(仍然)未使用的文件;仅在需要时才创建文件。

下面是简化版本(不运行步骤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. 在头部部分,设置目录的路径(以及可选的:更改基本名称和/或扩展名,shebang)。
  3. 将脚本另存为create_empty.py
  4. 从快捷方式运行脚本:“系统设置”>“键盘”>“自定义快捷方式”。添加命令:

    python3 /path/to/create_empty.py
    

3

您可以使用以下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

2

bash方法是好的,但如果你用的是不支持大括号扩展外壳的工作?例如touch file{1..10}对我不起作用mksh。这是三种与外壳无关的替代方法。

序列

一种与外壳无关的方法是将seq命令组合以生成使用printfoptions 格式化的数字序列,并将其传递给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

佩尔

当然,作为相当广泛的* nix工具,Perl也可以做到这一点。我们在此处具有的特定一线命令如下:

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-formatting格式完成,%04d部分),并附加.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单行代码。虽然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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.