จะสร้างไฟล์หลายไฟล์ด้วย Terminal ได้อย่างไร?


46

ฉันเรียนรู้ที่จะเขียนโปรแกรมด้วยหนังสือแนะนำเบื้องต้นที่ยอดเยี่ยมมากถึง C และฉันเขียนทุกตัวอย่างและภารกิจเพื่อที่ฉันจะได้เรียนรู้ไวยากรณ์ด้วยใจ ฉันทำทุกไฟล์ด้วยตนเองจนถึงตอนนี้ แต่การคลิกการตั้งชื่อและการบันทึกทำให้หมดแรง

ฉันต้องมีวิธีในการสร้างไฟล์หลายชอบbspl0001.c, bspl0002.c, bspl0003.cฯลฯ และบันทึกไว้ในไดเรกทอรี "learning_c" หรือบางสิ่งบางอย่าง

ฉันเป็น noob กับ Ubuntu / Linux และเรียกใช้ผ่าน VirtualBox เท่านั้นเพราะ IDE Geany นั้นติดตั้งง่าย ดังนั้นฉันไม่รู้จริงๆว่า Terminal ทำงานอย่างไร

แก้ไขฉันเพิ่งพบว่าตัวเองอยู่ในบัญชีเก่าของฉันและสั่นหัวของฉันเกี่ยวกับสาเหตุที่ฉันต้องการเรียนรู้ไวยากรณ์รหัสด้วยหัวใจ สนุกมากฉันเกือบจะสำเร็จการศึกษา CS / Math BSc แล้ว ขอบคุณมากสำหรับความช่วยเหลือในการเข้าใจถึงปัญหาหลังเหตุการณ์!


1
เหตุใดจึงสร้างไฟล์ทั้งหมดพร้อมกัน สิ่งที่ฉันกำลังใช้จริง: กดปุ่มผสมเพื่อ 1. ดูในไดเรกทอรีรหัสของฉันสิ่งที่ควรเป็นไฟล์ "ถัดไป" 2. สร้างไฟล์ชื่ออย่างถูกต้อง (รวมถึง shebang) และ 3. เปิดในตัวแก้ไขของฉัน (ในกรณีของฉัน ไม่ได้ใช้งาน) ทั้งหมดในหนึ่งปุ่มกด วิธีนี้ทำให้คุณป้องกันไฟล์ที่ไม่ได้ใช้ (ยังคง) จำนวนมาก
Jacob Vlijm

คำตอบ:


77

คุณสามารถทำได้ด้วยคำสั่งเหล่านี้:

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

คำอธิบาย:


  • mkdir learning_c

    • จะเป็นการสร้างโฟลเดอร์ที่เรียกว่าlearning_cในโฟลเดอร์ปัจจุบัน
    • โฟลเดอร์ปัจจุบันโดยปกติจะเรียกว่าโฮมโฟลเดอร์ของคุณ ~
    • คุณสามารถเปลี่ยนไดเรกทอรีปัจจุบันโดยใช้cdคำสั่ง (เช่นcd Desktop)
  • cd learning_c

    • ใช่คุณสามารถเดาได้ว่าคุณกำลังเข้าสู่โฟลเดอร์ที่สร้างขึ้นใหม่
  • touch bspl{0001..0003}.c

    • touchเป็นเครื่องมือในการสร้างไฟล์เปล่าและแก้ไขการประทับเวลา เรากำลังสร้างไฟล์เปล่า
    • touch myfilemyfileจะสร้างไฟล์ที่ว่างเปล่าที่เรียกว่า
    • รหัสน่าเกลียดที่ดังต่อไปนี้ ( bspl{0001..0003}.c) เรียกว่าการขยายตัวรั้ง นี่เป็นคุณสมบัติที่ยอดเยี่ยมของbashเชลล์ที่ให้คุณสร้างรายการที่ยาวของการรวมสตริงโดยพลการ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ในทุบตีแฮกเกอร์วิกิพีเดีย touchในกรณีนี้คุณจะทำรายการยาวของพารามิเตอร์ที่จะถูกส่งผ่านไปยัง คุณยังสามารถใช้ความยาวที่เทียบเท่าได้:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • คุณสามารถเปลี่ยนจำนวนของไฟล์: ถ้าคุณต้องการ 12 bspl{0001..0012}.cไฟล์ที่คุณสามารถเรียกใช้

    • ศูนย์นำหน้า ( 0012แทน12) ตรวจสอบให้แน่ใจว่าผลลัพธ์ใช้ตัวเลข 4 ศูนย์

4
อีกวิธีหนึ่งเพื่อประหยัดการกดแป้นบางครั้งtouch bspl000{1..3}.c
Reid

1
@Reid: และจะเกิดอะไรขึ้นถ้า Herios ต้องการไฟล์ 10 ไฟล์ขึ้นไป
Helio

3
สำหรับผู้ที่ต้องการสร้างรายชื่อไฟล์ที่มีนามสกุลเหมือนกันtouch {test,tes2,tes3}.js
Rick

1
@ Rick: ไม่ใช่สิ่งที่ฉันตอบ ;-) รหัสของคุณสามารถลดความซับซ้อนได้:touch tes{t,2,3}.js
Helio

1
และคุณสามารถทำได้ในหนึ่งบรรทัดคำสั่ง: $ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c The ";" จะช่วยคุณเพิ่มคำสั่งที่จะดำเนินการตามลำดับทีละรายการ
Pavlos Theodorou

4

สร้างไฟล์หมายเลข (ถัดไป) อย่างถูกต้องด้วยคีย์ผสมทางลัด

เหตุใดจึงสร้างไฟล์ทั้งหมดพร้อมกัน ข้อเสียคือคุณจะมีไฟล์ว่างเปล่าและไม่ได้ใช้งานจำนวนมาก สิ่งที่ฉันใช้จริง ๆ : กดแป้นผสมเพื่อ:

  1. มีสคริปต์ที่เห็นในไดเรกทอรีรหัสของฉันสิ่งที่ควรจะเป็นไฟล์ "ถัดไป"
  2. สร้างไฟล์ที่มีชื่ออย่างถูกต้อง (รวมถึง shebang) และ
  3. เปิดไฟล์ใหม่ในตัวแก้ไขของฉัน (ในกรณีที่ไม่ได้ใช้งาน)

ทั้งหมดในหนึ่งปุ่มกด ด้วยวิธีนี้คุณจะป้องกันไฟล์ที่ไม่ได้ใช้ (ยัง) จำนวนมาก ไฟล์จะถูกสร้างขึ้นเฉพาะเมื่อคุณต้องการ

เวอร์ชันที่เรียบง่ายด้านล่าง (ไม่ได้ทำงานในขั้นตอนที่ 3) ในทุก ๆ การกดปุ่มมันจะสร้างไฟล์ที่มีหมายเลขอย่างถูกต้องเช่น:

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

วิธีใช้

  1. คัดลอกสคริปต์ลงในไฟล์เปล่า
  2. ในส่วนหัวให้ตั้งค่าพา ธ ไปยังไดเรกทอรีของคุณ (และเป็นทางเลือก: เปลี่ยนชื่อฐานและ / หรือส่วนขยาย shebang)
  3. บันทึกสคริปต์เป็น create_empty.py
  4. เรียกใช้สคริปต์จากทางลัด: การตั้งค่าระบบ> คีย์บอร์ด> ทางลัดที่กำหนดเอง เพิ่มคำสั่ง:

    python3 /path/to/create_empty.py
    

3

คุณสามารถใช้รหัสไพ ธ อนต่อไปนี้คุณสามารถแก้ไขได้ตามความต้องการของคุณ
บันทึกรหัสต่อไปนี้ด้วยชื่อไฟล์filecreator.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"])

จากนั้นรันด้วยคำสั่งนี้:

python filecreator.py

2

bashวิธีที่เป็นสิ่งที่ดี แต่ถ้าคุณกำลังทำงานกับเปลือกที่ไม่สนับสนุนการขยายตัววงเล็บปีกกาหรือไม่? ยกตัวอย่างเช่นtouch file{1..10}ฉันไม่ทำงาน mkshต่อไปนี้เป็นอีกสามวิธีที่ใช้งานได้

หมายเลข

วิธีการที่เป็นกลางมากขึ้นคือการรวมseqคำสั่งเพื่อสร้างลำดับของตัวเลขที่จัดรูปแบบด้วยprintfตัวเลือกและส่งผ่านไปยังxargsคำสั่ง ตัวอย่างเช่น,

$ 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

แน่นอนว่า Perl เป็นเครื่องมือที่เป็นเครื่องมือในการสร้างคำศัพท์ * ซึ่งสามารถทำสิ่งนั้นได้เช่นกัน คำสั่งหนึ่งซับที่เฉพาะเจาะจงที่เรามีที่นี่มีดังต่อไปนี้:

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

สิ่งที่เกิดขึ้นที่นี่คือการที่เราระบุอาร์กิวเมนต์ของบรรทัดคำสั่ง 3 รายการ: คำนำหน้าชื่อไฟล์, ดัชนีเริ่มต้นและดัชนีสิ้นสุด จากนั้นเราใช้do { } for $ARGV[1] .. $ARGV[2]เพื่อทำซ้ำสำหรับช่วงของตัวเลขเฉพาะ พูดว่า$ARGV[1]คือ 5 และ$ARGV[2]9 เราจะทำซ้ำมากกว่า 5,6,7,8 และ 9

เกิดอะไรขึ้นกับการวนซ้ำแต่ละครั้งในวงเล็บปีกกา เราใช้แต่ละหมายเลขที่ระบุด้วย$_, และใช้sprintf()ฟังก์ชั่นสร้างสตริง m ซึ่ง splices อัพคำนำหน้า (อาร์กิวเมนต์บรรทัดคำสั่งแรก$ARGV[0]) , และหมายเลขที่กำหนด, แต่เติมตัวเลขด้วย 4 ศูนย์ (ซึ่งทำโดยprintf- สไตล์ของการจัดรูปแบบ, %04dส่วนหนึ่ง) และแนบคำต่อ.cท้ายผลลัพธ์ของการวนซ้ำแต่ละครั้งจึงทำให้ชื่อคล้ายbspl0001.cกัน

open(my $fh, ">", $var);close($fh)ได้อย่างมีประสิทธิภาพทำหน้าที่เป็นtouchคำสั่งการสร้างไฟล์ที่มีชื่อระบุ

ในขณะที่ความยาวเล็กน้อยมันทำงานได้ค่อนข้างดีในลักษณะคล้ายกับสคริปต์หลามของ Jacob Vlijm นอกจากนี้ยังสามารถแปลงเป็นสคริปต์เพื่อให้สามารถอ่านได้หากต้องการเช่น:

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

ให้ทดสอบสิ่งนี้ ครั้งแรกที่หนึ่งซับ:

$ 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

และตอนนี้สคริปต์:

$ 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

อีกวิธีคือจะawkใช้สำหรับการวนรอบการเปลี่ยนเส้นทางไปยังไฟล์ที่ระบุ วิธีนี้คล้ายกับ perl one-liner ที่มีอาร์กิวเมนต์บรรทัดคำสั่ง ในขณะที่awkยูทิลิตี้การประมวลผลข้อความเป็นหลัก แต่ก็ยังสามารถเขียนโปรแกรมระบบที่ยอดเยี่ยม

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.