web-dev-qa-db-ja.com

ターミナルで複数のファイルを作成する方法は?

私はCの非常にクールな入門書を使ってプログラミングすることを学んでいます。すべての例とタスクを書き留めて、構文を暗記できるようにします。これまで、すべてのファイルを手動で作成していましたが、クリック、命名、保存に手間がかかりました。

bspl0001.cbspl0002.cbspl0003.cなどのような複数のファイルを作成し、それらを「learning_c」ディレクトリなどに保存する方法が必要です。

私はUbuntu/Linuxの初心者で、正直にVirtualBox経由でのみ実行しています。なぜなら、IDE Geanyのセットアップは簡単だったからです。したがって、Terminalがどのように機能するのか、私は本当に知りません。

編集私はこの古いアカウントに自分自身を見つけたばかりで、なぜコード構文を暗記したいと思うのか、頭を振っています。おもしろいことに、CS/Math BScの研究はほぼ終わりました。後知恵で助けてくれてありがとう!

44
deranor

次のコマンドでこれを行うことができます。

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桁が使用されます。
73
Helio

ショートカットキーの組み合わせで正しい番号の(次の)ファイルを作成する

一度にすべてのファイルを作成するのはなぜですか?欠点は、空の未使用ファイルが大量にあることです。私が実際に使用しているもの:キーの組み合わせを押して:

  1. 「次の」ファイルをコードディレクトリに表示するスクリプトを作成し、
  2. 正しい名前のファイル(Shebangを含む)を作成し、
  3. エディターで新しいファイルを開きます(私の場合はIdle)。

すべて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

使い方

  1. スクリプトを空のファイルにコピーします
  2. ヘッドセクションで、ディレクトリへのパスを設定します(オプションで、ベース名や拡張子を変更、Shebang)。
  3. スクリプトをcreate_empty.pyとして保存します
  4. ショートカットからスクリプトを実行します:[システム設定]> [キーボード]> [カスタムショートカット]。コマンドを追加します。

    python3 /path/to/create_empty.py
    
4
Jacob Vlijm

次の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
3
bolzano

bashの方法は良いのですが、中括弧の展開をサポートしていないシェルで作業している場合はどうでしょうか? touch file{1..10}は、たとえばmkshでは機能しません。次に、シェルに関係なく機能する3つの代替方法を示します。

seq

よりシェルに中立なアプローチは、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

もちろん、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

別のアプローチは、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
2