Terminal ile birden fazla dosya nasıl oluşturulur?


46

C'ye harika bir tanıtım kitabıyla programlamayı öğrendim ve her örneği ve görevi yazıyorum, böylece sözdizimini gönülden öğrenebiliyorum. Her dosyayı şimdiye kadar manuel olarak yaptım, fakat tıklamak, adlandırmak ve kaydetmek yorucu oluyor.

Ben gibi birden fazla dosya oluşturmak için bir yol gerekir bspl0001.c, bspl0002.c, bspl0003.cvb ve dizin "learning_c" falan onları kurtarmak.

Ubuntu / Linux ile bir isim bilmiyorum ve dürüstçe bunu yalnızca VirtualBox ile çalıştırın, çünkü IDE Geany'nin kurulumu kolaydı. Böylece, Terminal'in nasıl çalıştığını gerçekten bilmiyorum.

düzenleme Ben sadece bu eski hesabımda kendimi buldum ve neden sürekli bir kod sözdizimi öğrenmek istediğim konusunda kafamı sallıyorum. Yeterince tuhaf, neredeyse CS / Math BSc derslerim bitiyor. Gezmedeki yardım için çok teşekkürler!


1
Neden tüm dosyaları bir kerede oluştur Aslında ne kullanıyorum: 1. bir kod kombinasyonuna basın 1. kod dizinimde "sonraki" dosya ne olmalı, 2. doğru adlandırılmış dosyayı oluşturun (shebang dahil) ve 3. editörümde açın (benim durumumda Boşta). Hepsi bir tuşa basıldığında. Bu şekilde, çok sayıda (hala) kullanılmayan dosyayı önlersiniz.
Jacob Vlijm

Yanıtlar:


77

Bunu şu komutlarla yapabilirsiniz:

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

Açıklama:


  • mkdir learning_c

    • Bu learning_c, geçerli klasörde adı verilen bir klasör oluşturur.
    • Geçerli klasör, genellikle sizin de adlandırdığınız ana klasördür. ~
    • Geçerli dizini cdkomutu kullanarak değiştirebilirsiniz (örn. cd Desktop)
  • cd learning_c

    • Evet, tahmin edebilirsiniz, yeni oluşturulan klasöre giriyorsunuz.
  • touch bspl{0001..0003}.c

    • touchboş dosyalar oluşturmak ve zaman damgalarını değiştirmek için bir araçtır; boş dosyalar yaratıyoruz.
    • touch myfileadlı boş bir dosya oluşturacak myfile.
    • Aşağıdaki çirkin kod ( bspl{0001..0003}.c), küme ayracı genişletmesi olarak adlandırılır . Bu, bashuzun isteğe bağlı dize birleşimleri listeleri oluşturmanıza olanak tanıyan kabuğun harika bir özelliğidir . Bu konuda daha fazla bilgiyi Bash Hacker Wiki'de bulabilirsiniz . Bu durumda, iletilecek olan parametrelerin uzun bir listesini yapacaksınız touch. Uzun eşdeğerini de kullanabilirsiniz:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Dosya sayısını değiştirebilirsiniz: 12 dosya istiyorsanız, çalıştırabilirsiniz bspl{0001..0012}.c.

    • Baştaki sıfırlar ( 0012bunun yerine 12) çıkışın sıfır dolgulu 4 basamak kullandığından emin olun.

4
Alternatif olarak, bazı tuş vuruşlarını kurtarmak için,touch bspl000{1..3}.c
Reid 20

1
@Reid: Herios 10 ya da daha fazla dosya isterse ne olur?
Helio

3
Aynı uzantıya sahip dosyaların bir listesini çıkarmak isteyenler içintouch {test,tes2,tes3}.js
Rick

1
@Rick: Cevap verdiğim şey değil mi? ;-) . Kodunuz basitleştirilebilir:touch tes{t,2,3}.js
Helio

1
ve bunu bir komut satırında da yapabilirsiniz: $ mkdir learning_c; cd learning_c; bspl000 {1,2,3,4} .c. ";" birbiri ardına sırayla yürütülecek komutları eklemenize yardımcı olacaktır.
Pavlos Theodorou

4

Kısayol tuş kombinasyonuyla doğru numaralandırılmış (sonraki) dosya oluşturun

Neden tüm dosyaları bir kerede oluştur Dezavantajı, çok sayıda boş ve kullanılmamış dosyaya sahip olmanızdır. Aslında ne kullanıyorum: Bir tuş bileşimine basarak:

  1. bir komut dosyası kod dizinimde "sonraki" dosya ne olmalı
  2. doğru adlandırılmış dosyayı (shebang dahil) oluşturun ve
  3. yeni dosyayı düzenleyicimde aç (benim durumumda Boşta).

Hepsi bir tuşa basıldığında. Bu şekilde, birçok (hala) kullanılmayan dosyayı önlersiniz; Dosyalar yalnızca ihtiyacınız olduğunda oluşturulur.

Aşağıda basitleştirilmiş bir sürüm (3. adımı çalıştırmıyorsunuz). Her tuşa basıldığında, aşağıdaki gibi doğru numaralandırılmış bir dosya oluşturulur:

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

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya kopyalayın
  2. Baş bölümünde, dizininizin yolunu ayarlayın (ve isteğe bağlı: taban adını ve / veya uzantısını değiştirin, shebang).
  3. Komut dosyasını create_empty.py olarak kaydedin
  4. Komut dosyasını bir kısayoldan çalıştırın: Sistem Ayarları> Klavye> Özel Kısayollar. Komutu ekle:

    python3 /path/to/create_empty.py
    

3

Aşağıdaki python kodunu kullanabilir, gereksinimlerinize uyacak şekilde değiştirebilirsiniz.
Aşağıdaki kodu dosya adıyla kaydedinfilecreator.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"])

Ve sonra bu komutla yürütün:

python filecreator.py

2

bashEğer küme ayracı genişleme desteklemeyen bir kabuk ile çalışıyorsanız yolu iyidir, ama ne? Mesela touch file{1..10}benim için çalışmıyor mksh. İşte kabuktan bağımsız olarak çalışan üç alternatif yol.

seq

Kabuk-nötr bir yaklaşım seq, printfseçeneklerle biçimlendirilmiş sayı dizisini üretmek için komutu birleştirmek ve onu xargskomuta geçirmek olacaktır . Örneğin,

$ 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

Tabii ki, Perl, oldukça yaygın bir * nix aracı olarak bunu da yapabilir. Burada sahip olduğumuz belirli bir liner komutu şöyledir:

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

Burada etkili olan, 3 komut satırı argümanını belirtmemiz: dosyaadı öneki, başlangıç ​​dizini ve bitiş dizini. Sonra do { } for $ARGV[1] .. $ARGV[2]belirli bir sayı aralığı için yineleme yapmak için kullanırız . Diyelim ki, $ARGV[1]5 ve $ARGV[2]9 idi, 5,6,7,8 ve 9'un üzerinde tekrar ederdik.

Kıvrımlı ayraçlar içindeki her yinelemede ne olur? ile belirtilen her sayıyı alırız $_ve sprintf()işlevi kullanarak önek (ilk komut satırı argümanı $ARGV[0]) ile verilen sayıyı birleştiren bir m dizgisi yaratırız , ancak sayıyı 4 sıfır ile doldururuz ( printfbiçimlendirme stiline göre yapılır , %04dparçası) ve son .cekini ekleyin bspl0001.c.

open(my $fh, ">", $var);close($fh)Etkin bir şekilde davranan touchBelirtilen ada sahip bir dosya oluşturarak, komuta.

Biraz uzun olsa da, Jacob Vlijm'in python senaryosuna benzer bir şekilde, oldukça iyi bir performans sergiliyor. Ayrıca istenirse okunabilirlik için bir komut dosyasına dönüştürülebilir, şöyle:

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

Bunu test edelim. İlk önce tek gömlek:

$ 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

Ve şimdi senaryo:

$ 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

Başka bir yaklaşım ise awkfor döngüsünü çalıştırarak belirli bir dosyaya yönlendirme yapmak olabilir. Yaklaşım, komut satırı argümanları ile perl one-liner'a benzer. İken awköncelikle bir metin işleme aracıdır, hala bazı serin sistem programlama yapabilirsiniz.

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.