Wie erstelle ich mit dem Terminal mehrere Dateien?

46

Ich habe gelernt, mit einem wirklich coolen Einführungsbuch für C zu programmieren, und ich schreibe jedes Beispiel und jede Aufgabe auf, damit ich die Syntax auswendig lernen kann. Ich habe bis jetzt jede Datei manuell erstellt, aber das Klicken, Benennen und Speichern wird anstrengend.

Ich brauche eine Möglichkeit , mehrere Dateien wie zu erstellen bspl0001.c, bspl0002.c, bspl0003.cusw. und sie im Verzeichnis „learning_c“ oder etwas zu retten.

Ich bin ein Anfänger von Ubuntu / Linux und kann es ehrlich gesagt nur über VirtualBox ausführen, da die IDE Geany einfach einzurichten war. Daher weiß ich nicht wirklich, wie das Terminal funktioniert.

edit Ich habe mich gerade in meinem alten Bericht wiedergefunden und schüttele den Kopf darüber, warum ich jemals auswendig eine Codesyntax lernen möchte. Lustigerweise bin ich fast fertig mit meinem CS / Math BSc-Studium. Vielen Dank für die Hilfe im Nachhinein!

deranor
quelle
1
Warum alle Dateien auf einmal erstellen? Was ich tatsächlich benutze: Drücken Sie eine Tastenkombination, um 1. in meinem Codeverzeichnis zu sehen, was die "nächste" Datei sein soll, 2. die korrekt benannte Datei (einschließlich shebang) zu erstellen und 3. sie in meinem Editor zu öffnen (in meinem Fall) Leerlauf). Alles in einem Tastendruck. Auf diese Weise verhindern Sie viele (noch) nicht verwendete Dateien.
Jacob Vlijm

Antworten:

77

Sie können dies mit diesen Befehlen tun:

mkdir learning_c
cd learning_c
touch bspl{0001..0003}.c

Erläuterung:


  • mkdir learning_c

    • Dadurch wird ein Ordner erstellt, der learning_cim aktuellen Ordner aufgerufen wird
    • Der aktuelle Ordner wird normalerweise auch als Basisordner bezeichnet ~
    • Sie können das aktuelle Verzeichnis mit dem cdBefehl (ie cd Desktop) ändern.
  • cd learning_c

    • Ja, Sie können es erraten, Sie betreten den neu erstellten Ordner
  • touch bspl{0001..0003}.c

    • touchist ein Tool zum Erstellen leerer Dateien und zum Ändern von Zeitstempeln. Wir erstellen leere Dateien.
    • touch myfileerstellt eine leere Datei mit dem Namen myfile.
    • Der hässliche Code, der auf ( bspl{0001..0003}.c) folgt, wird als geschweifte Klammer bezeichnet . Dies ist eine großartige Funktion der bashShell, mit der Sie lange Listen beliebiger Zeichenfolgenkombinationen erstellen können. Mehr dazu erfahren Sie im Bash Hackers Wiki . In diesem Fall erstellen Sie eine lange Liste von Parametern, an die übergeben wird touch. Sie können auch sein langes Äquivalent verwenden:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Sie können die Anzahl der Dateien ändern: Wenn Sie 12 Dateien möchten, können Sie ausführen bspl{0001..0012}.c.

    • Die führenden Nullen ( 0012anstelle von 12) stellen sicher, dass die Ausgabe 4-stellig mit Nullen aufgefüllt ist.
Helio
quelle
4
Alternativ, um einige Tastenanschläge zu speichern,touch bspl000{1..3}.c
Reid
1
@Reid: Und was passiert, wenn Herios 10 oder mehr Dateien haben möchte?
Helio,
3
Für diejenigen, die eine Liste von Dateien mit der gleichen Erweiterung erstellen möchtentouch {test,tes2,tes3}.js
Rick
1
@ Rick: Ist das nicht was ich antworte? ;-) . Ihr Code kann vereinfacht werden:touch tes{t,2,3}.js
Helio
1
Sie können dies auch in einer einzigen Befehlszeile tun: $ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c. Das ";" wird Ihnen helfen, Befehle hinzuzufügen, die nacheinander ausgeführt werden.
Pavlos Theodorou
4

Erstellen Sie eine richtig nummerierte (nächste) Datei mit einer Tastenkombination

Warum alle Dateien auf einmal erstellen? Der Nachteil ist, dass Sie viele leere und nicht verwendete Dateien haben. Was ich gerade benutze: Drücken Sie eine Tastenkombination, um:

  1. habe ein Skript in meinem Codeverzeichnis, was die "nächste" Datei sein soll,
  2. Erstellen Sie die korrekt benannte Datei (einschließlich shebang) und
  3. öffne die neue Datei in meinem Editor (in meinem Fall Idle).

Alles in einem Tastendruck. Auf diese Weise verhindern Sie viele (noch) nicht verwendete Dateien. Die Dateien werden nur erstellt, wenn Sie sie benötigen.

Eine vereinfachte Version unten (Schritt 3 wird nicht ausgeführt). Bei jedem Tastendruck wird eine korrekt nummerierte Datei wie folgt erstellt:

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

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei
  2. Legen Sie im Abschnitt head den Pfad zu Ihrem Verzeichnis fest (und optional: Ändern Sie den Basisnamen und / oder die Erweiterung shebang).
  3. Speichern Sie das Skript als create_empty.py
  4. Führen Sie das Skript über eine Verknüpfung aus: Systemeinstellungen> Tastatur> Benutzerdefinierte Verknüpfungen. Fügen Sie den Befehl hinzu:

    python3 /path/to/create_empty.py
    
Jacob Vlijm
quelle
3

Sie können den folgenden Python-Code verwenden und an Ihre Bedürfnisse anpassen.
Speichern Sie den folgenden Code mit Dateinamefilecreator.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"])

Und führen Sie es dann mit diesem Befehl aus:

python filecreator.py
Bozen
quelle
2

Der bashWeg ist gut, aber was ist, wenn Sie mit einer Shell arbeiten, die die Erweiterung der geschweiften Klammer nicht unterstützt? touch file{1..10}funktioniert bei mir mkshzum Beispiel nicht. Hier sind drei alternative Möglichkeiten, die unabhängig von der Shell funktionieren.

seq

Ein eher shellneutraler Ansatz wäre, den seqBefehl zu kombinieren , um eine mit printfOptionen formatierte Folge von Zahlen zu generieren , und ihn an den xargsBefehl weiterzuleiten . Zum Beispiel,

$ 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

Natürlich kann Perl, ein weit verbreitetes * nix-Tool, das auch. Der spezifische Einzeiler-Befehl, den wir hier haben, ist der folgende:

perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5 

Im Grunde genommen werden hier drei Befehlszeilenargumente angegeben: Dateinamenpräfix, Startindex und Endindex. Anschließend do { } for $ARGV[1] .. $ARGV[2]iterieren wir für einen bestimmten Zahlenbereich. Sagen wir , $ARGV[1]war 5 und $ARGV[2]war 9, wir würden über 5,6,7,8 und 9 iterieren.

Was passiert bei jeder Iteration innerhalb der geschweiften Klammern? Wir nehmen jede mit angegebene Zahl $_und sprintf()erstellen mit function einen String m, der das Präfix (erstes Kommandozeilenargument $ARGV[0]) und die angegebene Zahl printfaufteilt , aber die Zahl mit 4 Nullen auffüllt (dies geschieht durch -Stil der Formatierung). %04dTeil), und fügen Sie das .cSuffix. Als Ergebnis auf jeder Iteration bilden wir einen Namen wie bspl0001.c.

Das open(my $fh, ">", $var);close($fh)fungiert effektiv als touchBefehl und erstellt eine Datei mit dem angegebenen Namen.

Obwohl es ein wenig lang ist, funktioniert es recht gut, ähnlich wie das Python-Skript von Jacob Vlijm. Auf Wunsch kann es auch zur besseren Lesbarkeit in ein Skript konvertiert werden:

#!/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 ;
}

Lass uns das testen. Zuerst der Einzeiler:

$ 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

Und jetzt das Drehbuch:

$ 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

Ein anderer Ansatz wäre awk, eine for-Schleife auszuführen und zu einer bestimmten Datei umzuleiten. Der Ansatz ähnelt dem Perl-Einzeiler mit Befehlszeilenargumenten. Während awkes sich in erster Linie um ein Textverarbeitungsprogramm handelt, kann es dennoch einige coole Systemprogrammierungen durchführen.

$ 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
Sergiy Kolodyazhnyy
quelle