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


46

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

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

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

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


1
一度にすべてのファイルを作成するのはなぜですか?私が実際に使用しているもの:キーの組み合わせを押して、コードディレクトリで「次の」ファイルを確認します。アイドル)。すべて1つのキーを押します。これにより、多くの(まだ)未使用のファイルを防ぐことができます。
ジェイコブVlijm

回答:


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)に続くいコードはブレース展開と呼ばれます。これは、bash任意の文字列の組み合わせの長いリストを作成できるシェルの優れた機能です。この詳細については、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
リード

1
@Reid:そして、Heriosが10個以上のファイルを必要とするとどうなりますか?
ヘリオ

3
クレートに同じ拡張子を持つファイルのリストをしたいという人のためにtouch {test,tes2,tes3}.js
リック・

1
@リック:私が答えるものではないのですか? ;-)。コードを簡素化できますtouch tes{t,2,3}.js
。– Helio

1
また、1つのコマンドラインで実行することもできます:$ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c 「;」順番に実行するコマンドを追加するのに役立ちます。
パブロスセオドアー

4

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

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

  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
    

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。シェルに関係なく機能する3つの代替方法を次に示します。

seq

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

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-style of format によって行われます、%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 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.