Bagaimana cara membuat banyak file dengan Terminal?

46

Saya telah belajar memprogram dengan buku pengantar yang sangat keren untuk C dan saya menulis setiap contoh dan tugas sehingga saya dapat mempelajari sintaksisnya dengan hati. Saya melakukan setiap file secara manual sampai sekarang, tetapi mengklik, memberi nama dan menyimpan semakin melelahkan.

Aku butuh cara untuk membuat beberapa file seperti bspl0001.c, bspl0002.c, bspl0003.c, dll dan menyimpannya dalam direktori "learning_c" atau sesuatu.

Saya seorang noob dengan Ubuntu / Linux dan jujur ​​hanya menjalankannya melalui VirtualBox karena IDE Geany mudah diatur. Jadi, saya tidak benar-benar tahu cara kerja Terminal.

sunting Saya baru saja menemukan diri saya di akun lama ini dan menggelengkan kepala tentang mengapa saya ingin mempelajari sintaksis kode dengan hati. Lucunya, saya hampir selesai dengan studi CS / Math BSc saya. Terima kasih banyak atas bantuannya!

Deranor
sumber
1
Mengapa membuat semua file sekaligus? Apa yang sebenarnya saya gunakan: tekan kombinasi tombol untuk 1. lihat di direktori kode saya apa yang seharusnya menjadi file "berikutnya", 2. buat file dengan nama yang benar (termasuk shebang) dan 3. buka di editor saya (dalam kasus saya Diam). Semua dalam satu penekanan tombol. Dengan begitu Anda mencegah banyak (masih) file yang tidak digunakan.
Jacob Vlijm

Jawaban:

77

Anda dapat melakukan ini dengan perintah-perintah ini:

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

Penjelasan:


  • mkdir learning_c

    • Ini akan membuat folder yang disebut learning_cdi folder saat ini
    • Folder saat ini biasanya adalah folder rumah Anda juga disebut ~
    • Anda dapat mengubah direktori saat ini menggunakan cdperintah (yaitu cd Desktop)
  • cd learning_c

    • Ya, Anda bisa menebaknya, Anda memasukkannya di folder yang baru dibuat
  • touch bspl{0001..0003}.c

    • touchadalah alat untuk membuat file kosong dan memodifikasi cap waktu; kami sedang membuat file kosong.
    • touch myfileakan membuat file kosong bernama myfile.
    • Kode jelek yang mengikuti ( bspl{0001..0003}.c) disebut ekspansi penjepit . Ini adalah fitur hebat dari bashshell yang memungkinkan Anda membuat daftar panjang kombinasi string arbitrer. Anda dapat mempelajari lebih lanjut tentang ini di Bash Hackers Wiki . Dalam hal ini Anda akan membuat daftar panjang parameter yang akan diteruskan ke touch. Anda juga dapat menggunakan padanannya yang panjang:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Anda dapat mengubah jumlah file: jika Anda ingin 12 file, Anda dapat menjalankan bspl{0001..0012}.c.

    • Angka nol di depan ( 0012bukan 12) memastikan bahwa output menggunakan 4 digit nol.
Helio
sumber
4
Bergantian, untuk menghemat penekanan tombol,touch bspl000{1..3}.c
Reid
1
@ Reid: Dan apa yang terjadi jika Herios menginginkan 10 file atau lebih?
Helio
3
Bagi mereka yang ingin membuat daftar file dengan ekstensi yang samatouch {test,tes2,tes3}.js
Rick
1
@ Rick: Bukankah itu yang saya jawab? ;-) . Kode Anda dapat disederhanakan:touch tes{t,2,3}.js
Helio
1
dan Anda juga dapat melakukannya dalam satu baris perintah: $ mkdir learning_c; cd learning_c; sentuh bspl000 {1,2,3,4} .c. ";" akan membantu Anda menambahkan perintah yang akan dijalankan secara berurutan.
Pavlos Theodorou
4

Buat file bernomor (berikutnya) dengan benar dengan kombinasi tombol pintas

Mengapa membuat semua file sekaligus? Kerugiannya adalah Anda akan memiliki banyak file kosong dan tidak terpakai. Apa yang sebenarnya saya gunakan: tekan kombinasi tombol untuk:

  1. memiliki skrip lihat di direktori kode saya apa yang harus menjadi file "selanjutnya",
  2. buat file dengan nama yang benar (termasuk shebang) dan
  3. buka file baru di editor saya (dalam kasus saya menganggur).

Semua dalam satu penekanan tombol. Dengan begitu Anda mencegah banyak (masih) file yang tidak digunakan; File hanya dibuat jika Anda membutuhkannya.

Versi sederhana di bawah ini (tidak menjalankan langkah 3). Pada setiap penekanan tombol, itu akan membuat file bernomor dengan benar seperti:

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

Cara Penggunaan

  1. Salin skrip ke file kosong
  2. Di bagian kepala, setel path ke direktori Anda (dan opsional: ubah nama dasar dan / atau ekstensi, shebang).
  3. Simpan skrip sebagai create_empty.py
  4. Jalankan skrip dari pintasan: Pengaturan Sistem> Keyboard> Pintasan Khusus. Tambahkan perintah:

    python3 /path/to/create_empty.py
    
Yakub Vlijm
sumber
3

Anda dapat menggunakan kode python berikut, Anda dapat memodifikasinya sesuai dengan kebutuhan Anda.
Simpan kode berikut dengan nama filefilecreator.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"])

Dan kemudian jalankan dengan perintah ini:

python filecreator.py
bolzano
sumber
2

The bashcara adalah baik, tetapi bagaimana jika Anda bekerja dengan shell yang tidak mendukung ekspansi penjepit keriting? touch file{1..10}misalnya, tidak bekerja untuk saya mksh. Berikut tiga cara alternatif yang berfungsi terlepas dari cangkang.

seq

Pendekatan yang lebih netral shell adalah menggabungkan seqperintah untuk menghasilkan urutan angka yang diformat dengan printfopsi, dan meneruskannya ke xargsperintah. Sebagai contoh,

$ 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

Tentu saja, Perl, sebagai alat * nix yang lebar, dapat melakukannya juga. Perintah one-liner spesifik yang kita miliki di sini adalah sebagai berikut:

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

Secara efektif apa yang terjadi di sini adalah kita menentukan 3 argumen baris perintah: awalan nama file, indeks awal, dan indeks akhir. Kemudian kita gunakan do { } for $ARGV[1] .. $ARGV[2]untuk beralih ke kisaran angka tertentu. Katakanlah, $ARGV[1]adalah 5 dan $ARGV[2]9, kami akan mengulangi lebih dari 5,6,7,8 dan 9.

Apa yang terjadi pada setiap iterasi dalam kurung kurawal? kita mengambil setiap angka yang ditentukan dengan $_, dan menggunakan sprintf()fungsi membuat string m yang menyambungkan awalan (argumen baris perintah pertama, $ARGV[0]) dan nomor yang diberikan, tetapi mengisi angka dengan 4 nol (yang dilakukan dengan- printfgaya pemformatan, %04dbagian), dan lampirkan .csuffix. Sebagai hasil pada setiap iterasi kita membuat nama seperti bspl0001.c.

Secara open(my $fh, ">", $var);close($fh)efektif bertindak sebagai touchperintah, membuat file dengan nama yang ditentukan.

Meskipun sedikit panjang, performanya cukup baik, dengan cara yang mirip dengan skrip python Jacob Vlijm. Itu juga dapat dikonversi ke skrip untuk dibaca jika diinginkan, seperti:

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

Mari kita coba ini. Pertama, satu-liner:

$ 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

Dan sekarang skripnya:

$ 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

Pendekatan lain akan dengan awk, menjalankan loop for, mengarahkan ke file tertentu. Pendekatannya mirip dengan perl one-liner dengan argumen command-line. Walaupun awkterutama merupakan utilitas pemrosesan teks, masih dapat melakukan beberapa pemrograman sistem yang keren.

$ 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
sumber