私はCの非常にクールな入門書を使ってプログラミングすることを学んでいます。すべての例とタスクを書き留めて、構文を暗記できるようにします。これまで、すべてのファイルを手動で作成していましたが、クリック、命名、保存に手間がかかりました。
bspl0001.c
、bspl0002.c
、bspl0003.c
などのような複数のファイルを作成し、それらを「learning_c」ディレクトリなどに保存する方法が必要です。
私はUbuntu/Linuxの初心者で、正直にVirtualBox経由でのみ実行しています。なぜなら、IDE Geanyのセットアップは簡単だったからです。したがって、Terminalがどのように機能するのか、私は本当に知りません。
編集私はこの古いアカウントに自分自身を見つけたばかりで、なぜコード構文を暗記したいと思うのか、頭を振っています。おもしろいことに、CS/Math BScの研究はほぼ終わりました。後知恵で助けてくれてありがとう!
次のコマンドでこれを行うことができます。
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
シェルの優れた機能です。詳細については、 Bash Hackers Wiki をご覧ください。この場合、touch
に渡されるパラメーターの長いリストを作成します。長い同等のものを使用することもできます:
touch bspl0001.c bspl0002.c bspl0003.c
ファイルの数を変更できます。12個のファイルが必要な場合は、bspl{0001..0012}.c
を実行できます。
0012
の代わりに12
)を使用すると、出力でゼロが埋め込まれた4桁が使用されます。一度にすべてのファイルを作成するのはなぜですか?欠点は、空の未使用ファイルが大量にあることです。私が実際に使用しているもの:キーの組み合わせを押して:
すべて1つのキーを押します。これにより、多くの(まだ)未使用のファイルを防ぐことができます。ファイルは、必要な場合にのみ作成されます。
以下の簡略版(ステップ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
ショートカットからスクリプトを実行します:[システム設定]> [キーボード]> [カスタムショートカット]。コマンドを追加します。
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
の方法は良いのですが、中括弧の展開をサポートしていないシェルで作業している場合はどうでしょうか? touch file{1..10}
は、たとえばmksh
では機能しません。次に、シェルに関係なく機能する3つの代替方法を示します。
よりシェルに中立なアプローチは、seq
コマンドを組み合わせてprintf
optionsでフォーマットされた数字のシーケンスを生成し、それを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は非常に広く使用されている* 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()
関数を使用して、プレフィックス(最初のコマンドライン引数、$ARGV[0]
)と指定された番号をつなぎ合わせる文字列mを作成します4つのゼロを持つ数字(printf
スタイルの書式設定、%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
を使用して、forループを実行し、特定のファイルにリダイレクトすることです。このアプローチは、コマンドライン引数を使用したPerlの1ライナーに似ています。 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