Làm cách nào để tạo nhiều tệp với Terminal?


46

Tôi đã học lập trình với một cuốn sách giới thiệu thực sự tuyệt vời cho C và tôi viết ra mọi ví dụ và nhiệm vụ để tôi có thể học cú pháp bằng trái tim. Tôi đã làm mọi thủ công cho đến bây giờ, nhưng việc nhấp, đặt tên và lưu lại bị cạn kiệt.

Tôi cần một cách để tạo ra nhiều file như bspl0001.c, bspl0002.c, bspl0003.c, vv và lưu chúng trong thư mục "learning_c" hoặc một cái gì đó.

Tôi là một người mới với Ubuntu / Linux và thực sự chỉ chạy nó qua VirtualBox vì IDE Geany rất dễ thiết lập. Vì vậy, tôi không thực sự biết cách thức hoạt động của Terminal.

chỉnh sửa Tôi vừa tìm thấy chính mình trong tài khoản cũ này của tôi và đang lắc đầu về lý do tại sao tôi muốn học một cú pháp mã bằng trái tim. Thật thú vị, tôi gần như hoàn thành với các nghiên cứu Cử nhân CS / Toán của mình. Cảm ơn rất nhiều vì sự giúp đỡ trong nhận thức muộn màng!


1
Tại sao tạo tất cả các tệp cùng một lúc? Những gì tôi thực sự đang sử dụng: nhấn tổ hợp phím đến 1. xem trong thư mục mã của tôi, đâu là tệp "tiếp theo", 2. tạo tệp có tên chính xác (bao gồm shebang) và 3. mở nó trong trình soạn thảo của tôi (trong trường hợp của tôi Nhàn rỗi). Tất cả trong một phím nhấn. Bằng cách đó, bạn ngăn chặn rất nhiều (vẫn) các tệp không sử dụng.
Jacob Vlijm

Câu trả lời:


77

Bạn có thể làm điều này với các lệnh sau:

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

Giải trình:


  • mkdir learning_c

    • Điều này sẽ tạo ra một thư mục được gọi learning_ctrong thư mục hiện tại
    • Thư mục hiện tại thường là thư mục nhà của bạn cũng được gọi là ~
    • Bạn có thể thay đổi thư mục hiện tại bằng cách sử dụng cdlệnh (tức là cd Desktop)
  • cd learning_c

    • Có, bạn có thể đoán nó, bạn đang nhập vào thư mục vừa tạo
  • touch bspl{0001..0003}.c

    • touchlà một công cụ để tạo các tệp trống và sửa đổi dấu thời gian; chúng tôi đang tạo tập tin trống.
    • touch myfilesẽ tạo một tập tin trống được gọi là myfile.
    • Mã xấu xí theo sau ( bspl{0001..0003}.c) được gọi là mở rộng dấu ngoặc . Đây là một tính năng tuyệt vời của bashshell cho phép bạn tạo danh sách dài các kết hợp chuỗi tùy ý. Bạn có thể tìm hiểu thêm về điều này trong Bash Hackers Wiki . Trong trường hợp này, bạn sẽ tạo một danh sách dài các tham số sẽ được chuyển đến touch. Bạn cũng có thể sử dụng tương đương dài của nó:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Bạn có thể thay đổi số lượng tệp: nếu bạn muốn 12 tệp, bạn có thể chạy bspl{0001..0012}.c.

    • Các số 0 đứng đầu ( 0012thay vì 12) đảm bảo rằng đầu ra sử dụng 4 chữ số không đệm.

4
Thay phiên, để lưu một số tổ hợp phím,touch bspl000{1..3}.c
Reid

1
@Reid: Và điều gì xảy ra nếu Herios muốn có 10 tệp trở lên?
Helio

3
Đối với những người muốn gửi một danh sách các tệp có cùng phần mở rộngtouch {test,tes2,tes3}.js
Rick

1
@Rick: Không phải tôi trả lời sao? ;-) . Mã của bạn có thể được đơn giản hóa:touch tes{t,2,3}.js
Helio

1
và bạn cũng có thể làm điều đó trong một dòng lệnh: $ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c. Các ";" sẽ giúp bạn thêm các lệnh sẽ thực hiện theo thứ tự lần lượt.
Pavlos Theodorou

4

Tạo tập tin được đánh số chính xác (tiếp theo) bằng tổ hợp phím tắt

Tại sao tạo tất cả các tệp cùng một lúc? Nhược điểm là bạn sẽ có rất nhiều tập tin trống và không sử dụng. Những gì tôi thực sự đang sử dụng: nhấn tổ hợp phím để:

  1. có một tập lệnh xem trong thư mục mã của tôi những gì nên là tập tin "tiếp theo",
  2. tạo tập tin được đặt tên chính xác (bao gồm shebang) và
  3. mở tập tin mới trong trình soạn thảo của tôi (trong trường hợp của tôi là Idle).

Tất cả trong một phím nhấn. Bằng cách đó, bạn ngăn chặn rất nhiều (vẫn) các tệp không sử dụng; Các tập tin chỉ được tạo nếu bạn cần chúng.

Một phiên bản đơn giản hóa dưới đây (không chạy bước 3). Trên mỗi lần nhấn, nó sẽ tạo một tệp được đánh số chính xác như:

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

Cách sử dụng

  1. Sao chép tập lệnh vào một tập tin trống
  2. Trong phần đầu, đặt đường dẫn đến thư mục của bạn (và tùy chọn: thay đổi tên cơ sở và / hoặc phần mở rộng, shebang).
  3. Lưu tập lệnh dưới dạng created_empty.py
  4. Chạy tập lệnh từ một phím tắt: Cài đặt hệ thống> Bàn phím> Phím tắt tùy chỉnh. Thêm lệnh:

    python3 /path/to/create_empty.py
    

3

Bạn có thể sử dụng mã python sau đây, bạn có thể sửa đổi nó để phù hợp với nhu cầu của bạn.
Lưu mã sau với tên tệpfilecreator.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"])

Và sau đó thực hiện nó với lệnh này:

python filecreator.py

2

Các bashcách là tốt, nhưng những gì nếu bạn đang làm việc với một lớp vỏ mà không hỗ trợ việc mở rộng cú đúp xoăn? touch file{1..10}không làm việc cho tôi mkshchẳng hạn. Đây là ba cách thay thế hoạt động bất kể vỏ.

seq

Một cách tiếp cận trung tính vỏ hơn sẽ là kết hợp seqlệnh để tạo ra chuỗi số được định dạng với printfcác tùy chọn và chuyển nó sang xargslệnh. Ví dụ,

$ 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

Tất nhiên, Perl, là một công cụ * nix khá phổ biến, cũng có thể làm điều đó. Lệnh one-liner cụ thể mà chúng ta có ở đây là như sau:

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

Thực tế, điều xảy ra ở đây là chúng tôi chỉ định 3 đối số dòng lệnh: tiền tố tên tệp, chỉ mục bắt đầu và chỉ mục kết thúc. Sau đó, chúng tôi sử dụng do { } for $ARGV[1] .. $ARGV[2]để lặp cho một phạm vi số cụ thể. Nói, $ARGV[1]là 5 và $ARGV[2]là 9, chúng tôi sẽ lặp lại trên 5,6,7,8 và 9.

Điều gì xảy ra trên mỗi lần lặp trong niềng răng xoăn? chúng tôi lấy từng số được chỉ định $_và sử dụng sprintf()hàm tạo một chuỗi m để tách tiền tố (đối số dòng lệnh đầu tiên $ARGV[0]) và số đã cho, nhưng điền vào số đó bằng 4 số không (được thực hiện theo printfkiểu định dạng, %04dmột phần) và đính kèm hậu .ctố. Kết quả trên mỗi lần lặp chúng ta tạo thành một tên như thế nào bspl0001.c.

Hiệu open(my $fh, ">", $var);close($fh)quả hoạt động như touchlệnh, tạo một tệp với tên được chỉ định.

Mặc dù hơi dài nhưng nó hoạt động khá tốt, theo kiểu tương tự kịch bản python của Jacob Vlijm. Nó cũng có thể được chuyển đổi thành một tập lệnh để dễ đọc nếu muốn, như vậy:

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

Hãy kiểm tra điều này. Đầu tiên một lớp lót:

$ 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

Và bây giờ là kịch bản:

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

ôi

Một cách tiếp cận khác sẽ là awk, chạy một vòng lặp for, chuyển hướng đến một tệp cụ thể. Cách tiếp cận tương tự như perl one-liner với các đối số dòng lệnh. Mặc dù awkchủ yếu là một tiện ích xử lý văn bản, nó vẫn có thể thực hiện một số chương trình hệ thống thú vị.

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.