Jak utworzyć wiele plików za pomocą terminala?


46

Uczę się programować z naprawdę fajną książką wprowadzającą do C i zapisuję każdy przykład i zadanie, aby nauczyć się składni na pamięć. Do tej pory robiłem każdy plik ręcznie, ale klikanie, nazywanie i zapisywanie wyczerpuje się.

Potrzebuję sposób, aby utworzyć wiele plików, takich jak bspl0001.c, bspl0002.c, bspl0003.citp i zapisywanie ich w katalogu „learning_c” czy coś.

Jestem noob z Ubuntu / Linux i szczerze mówiąc, uruchamiam go tylko przez VirtualBox, ponieważ IDE Geany było łatwe do skonfigurowania. Dlatego tak naprawdę nie wiem, jak działa terminal.

edytuj Właśnie znalazłem się na moim starym koncie i kręcę głową, dlaczego kiedykolwiek chciałbym nauczyć się składni kodu na pamięć. Co zabawne, prawie skończyłem studia CS / Math BSc. Wielkie dzięki za pomoc z perspektywy czasu!


1
Po co tworzyć wszystkie pliki jednocześnie? Z czego faktycznie korzystam: naciśnij kombinację klawiszy, aby 1. zobaczyć w moim katalogu kodu, jaki powinien być „następny” plik, 2. utworzyć poprawnie nazwany plik (w tym shebang) i 3. otworzyć go w moim edytorze (w moim przypadku Bezczynny). Wszystko za jednym naciśnięciem klawisza. W ten sposób zapobiegniesz wielu (wciąż) nieużywanym plikom.
Jacob Vlijm,

Odpowiedzi:


77

Możesz to zrobić za pomocą następujących poleceń:

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

Wyjaśnienie:


  • mkdir learning_c

    • Spowoduje to utworzenie folderu o nazwie learning_cw bieżącym folderze
    • Bieżący folder to zwykle także folder domowy ~
    • Możesz zmienić bieżący katalog za pomocą cdpolecenia (tj. cd Desktop)
  • cd learning_c

    • Tak, możesz się domyślić, wchodzisz do nowo utworzonego folderu
  • touch bspl{0001..0003}.c

    • touchjest narzędziem do tworzenia pustych plików i modyfikowania znaczników czasu; tworzymy puste pliki.
    • touch myfileutworzy pusty plik o nazwie myfile.
    • Brzydki kod następujący po ( bspl{0001..0003}.c) nazywa się rozszerzeniem nawiasu klamrowego . Jest to świetna funkcja bashpowłoki, która pozwala tworzyć długie listy dowolnych kombinacji ciągów. Możesz dowiedzieć się więcej na ten temat na Wiki Bash Hackers . W takim przypadku utworzysz długą listę parametrów, które zostaną przekazane touch. Możesz także użyć jego długiego odpowiednika:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Możesz zmienić liczbę plików: jeśli chcesz 12 plików, możesz uruchomić bspl{0001..0012}.c.

    • Zera wiodące ( 0012zamiast 12) upewnij się, że w danych wyjściowych używane są 4 cyfry uzupełnione zerami .

4
Alternatywnie, aby zaoszczędzić trochę klawiszy,touch bspl000{1..3}.c
Reid

1
@Reid: A co się stanie, jeśli Herios chce 10 lub więcej plików?
Helio

3
Dla tych, którzy chcą stworzyć listę plików z tym samym rozszerzeniemtouch {test,tes2,tes3}.js
Rick

1
@Rick: Czy nie mam na to odpowiedzi? ;-) . Twój kod można uprościć:touch tes{t,2,3}.js
Helio

1
i możesz to również zrobić w jednym wierszu poleceń: $ mkdir learning_c; cd learning_c; dotknij bspl000 {1,2,3,4} .c. „;” pomoże Ci dodać polecenia, które będą wykonywane w kolejności jedna po drugiej.
Pavlos Theodorou

4

Utwórz poprawnie ponumerowany (następny) plik za pomocą kombinacji klawiszy skrótu

Po co tworzyć wszystkie pliki jednocześnie? Wadą jest to, że będziesz mieć dużo pustych i nieużywanych plików. Z czego faktycznie korzystam: naciśnij kombinację klawiszy, aby:

  1. w moim katalogu kodu powinien znajdować się skrypt, który powinien być „następnym” plikiem,
  2. utwórz poprawnie nazwany plik (w tym shebang) i
  3. otwórz nowy plik w moim edytorze (w moim przypadku bezczynności).

Wszystko za jednym naciśnięciem klawisza. W ten sposób zapobiegniesz wielu (wciąż) nieużywanym plikom; Pliki są tworzone tylko wtedy, gdy ich potrzebujesz.

Uproszczona wersja poniżej (nie działa krok 3). Przy każdym naciśnięciu klawisza utworzy poprawnie numerowany plik, taki jak:

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

Jak używać

  1. Skopiuj skrypt do pustego pliku
  2. W sekcji head ustaw ścieżkę do swojego katalogu (i opcjonalnie: zmień nazwę podstawową i / lub rozszerzenie, shebang).
  3. Zapisz skrypt jako create_empty.py
  4. Uruchom skrypt ze skrótu: Ustawienia systemu> Klawiatura> Skróty niestandardowe. Dodaj polecenie:

    python3 /path/to/create_empty.py
    

3

Możesz użyć następującego kodu python, możesz go zmodyfikować zgodnie z własnymi potrzebami.
Zapisz następujący kod z nazwą plikufilecreator.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"])

A następnie uruchom go za pomocą tego polecenia:

python filecreator.py

2

bashDroga jest dobra, ale co, jeśli pracujesz z powłoki, która nie obsługuje kręcone rozwijanie nawiasów? touch file{1..10}na mkshprzykład nie działa dla mnie . Oto trzy alternatywne sposoby działania niezależnie od powłoki.

seq

Bardziej neutralne dla powłoki podejście byłoby połączenie seqpolecenia w celu wygenerowania sekwencji liczb sformatowanych za pomocą printfopcji i przekazania jej do xargspolecenia. Na przykład,

$ 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

Oczywiście Perl, który jest dość rozpowszechnionym narzędziem * nix, może to zrobić. Konkretne polecenie jednowierszowe, które tutaj mamy, jest następujące:

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

W efekcie podajemy 3 argumenty wiersza polecenia: przedrostek nazwy pliku, indeks początkowy i indeks końcowy. Następnie używamy do { } for $ARGV[1] .. $ARGV[2]iteracji dla określonego zakresu liczb. Powiedzmy, że $ARGV[1]było 5 i $ARGV[2]było 9, będziemy powtarzać ponad 5,6,7,8 i 9.

Co dzieje się podczas każdej iteracji w nawiasach klamrowych? bierzemy każdą liczbę określoną za $_pomocą i za pomocą sprintf()funkcji tworzymy ciąg m, który dzieli przedrostek (pierwszy argument wiersza poleceń $ARGV[0]) i podaną liczbę, ale wypełniając liczbę 4 zerami (co odbywa się poprzez printfstyl formatowania, %04dczęść) i dołącz .csufiks. W wyniku każdej iteracji tworzymy nazwę jak bspl0001.c.

open(my $fh, ">", $var);close($fh)Skutecznie działa jako touchpolecenia, tworząc plik o określonej nazwie.

Choć jest nieco długi, działa całkiem dobrze, podobnie jak skrypt Pythona Jacoba Vlijma. W razie potrzeby można go również przekonwertować na skrypt, aby był czytelny:

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

Sprawdźmy to. Najpierw jedna linijka:

$ 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

A teraz skrypt:

$ 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

Inne podejście polegałoby na awkuruchomieniu pętli for i przekierowaniu do określonego pliku. Podejście jest podobne do jednowierszowego perla z argumentami wiersza poleceń. Chociaż awkjest to przede wszystkim narzędzie do przetwarzania tekstu, nadal może robić fajne programowanie systemowe.

$ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.