如何使用终端创建多个文件?
我一直在学习编写一本非常酷的C入门书,我将每一个例子和任务都写下来,这样我就可以用心去学习语法。 到目前为止,我手动完成了每个文件,但是点击,命名和保存变得筋疲力尽。
我需要一种方法来创建多个文件,如bspl0001.c
, bspl0002.c
, bspl0003.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位数。
-
使用快捷键组合创建正确编号(下一个)文件
为什么一次创建所有文件? 缺点是你将有很多空的和未使用的文件。 我实际使用的是:按下一个组合键:
- 有一个脚本在我的代码目录中看到什么应该是“下一个”文件,
- 创建正确命名的文件(包括shebang)和
- 在我的编辑器中打开新文件(在我的情况下是空闲)。
一键一键。 这样你可以防止很多(仍然)未使用的文件; 只有在您需要时才会创建文件。
下面的简化版本(未运行第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
如何使用
- 将脚本复制到空文件中
- 在head部分中,设置目录的路径(可选:更改基本名称和/或扩展名,shebang)。
- 将脚本另存为create_empty.py
-
从快捷方式运行脚本:系统设置>键盘>自定义快捷方式。 添加命令:
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