Як створити декілька файлів за допомогою терміналу?


46

Я вчився програмувати справді класну вступну книгу на C, і записую кожен приклад і завдання, щоб я міг вивчити синтаксис напам'ять. Я до цього часу робив кожен файл вручну, але клацання, іменування та збереження стає виснажливим.

Мені потрібен спосіб , щоб створити кілька файлів , таких як bspl0001.c, bspl0002.c, bspl0003.cі т.д. , і зберігати їх в директорії «learning_c» або що - то.

Я ноб з Ubuntu / Linux і, чесно кажучи, запускаю його лише через VirtualBox, тому що IDE Geany було легко встановити. Таким чином, я не знаю, як працює Термінал.

редагувати Я щойно опинився в цьому моєму старому обліковому записі і хитаю головою про те, чому я коли-небудь хотів би вивчити синтаксис коду напам’ять. Як не дивно, що я майже закінчуюсь вивченням бакалавра CS / Math. Велике спасибі за допомогу в огляді!


1
Навіщо створювати всі файли одночасно? Що я фактично використовую: натисніть комбінацію клавіш, щоб 1. побачити в моєму кодовому каталозі, яким повинен бути "наступний" файл, 2. створити правильно названий файл (включаючи шебанг) ​​і 3. відкрити його в моєму редакторі (у моєму випадку Простою). Все в одне натискання клавіш. Таким чином ви запобігаєте багато (ще) невикористаних файлів.
Яків Влійм

Відповіді:


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 myfileстворить порожній файл під назвою myfile.
    • Некрасивий код, який слідує за ( bspl{0001..0003}.c), називається розширенням дужок . Це чудова особливість bashоболонки, яка дозволяє створювати довгі списки довільних комбінацій рядків. Докладніше про це можна дізнатися у Вікі Bash Hackers . У цьому випадку ви складете довгий список параметрів, які будуть передані 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: А що станеться, якщо Геріос хоче 10 або більше файлів?
Геліо

3
Для тих, хто хоче створити список файлів з тим же розширеннямtouch {test,tes2,tes3}.js
Рік

1
@Rick: Хіба я не відповів? ;-) . Ваш код можна спростити:touch tes{t,2,3}.js
Helio

1
і ви також можете зробити це в одному командному рядку: $ mkdir learning_c; cd learning_c; touch bspl000 {1,2,3,4} .c. ";" допоможе вам додати команди, які виконуватимуться для порядку одна за одною.
Павлос Феодору

4

Створіть правильно пронумерований (наступний) файл із комбінацією клавіш швидкого доступу

Навіщо створювати всі файли одночасно? Недоліком є ​​те, що у вас буде багато порожніх та невикористаних файлів. Що я фактично використовую: натисніть комбінацію клавіш, щоб:

  1. мати скрипт, дивіться в моєму кодовому каталозі, що має бути "наступним" файлом,
  2. створити правильно названий файл (включаючи шебанг) ​​та
  3. відкрити новий файл у моєму редакторі (в моєму випадку Idle).

Все в одне натискання клавіш. Таким чином ви запобігаєте багато (ще) невикористаних файлів; Файли створюються лише в тому випадку, якщо вони вам потрібні.

Спрощена версія нижче (не виконується крок 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. У головному розділі встановіть шлях до каталогу (та необов'язково: змініть базову назву та / або розширення, шебанг).
  3. Збережіть сценарій як create_empty.py
  4. Запустіть сценарій із ярлика: Налаштування системи> Клавіатура> Спеціальні ярлики. Додайте команду:

    python3 /path/to/create_empty.py
    

3

Ви можете використовувати наступний код python, ви можете змінити його відповідно до ваших потреб.
Збережіть наступний код із назвою файлу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, будучи досить широким інструментом * nix, може це зробити і. Конкретна команда з одним лайнером, яку ми маємо тут, полягає в наступному:

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, який з'єднує префікс (перший аргумент командного рядка $ARGV[0]) та задане число, але заповнюючи число 4 нулями (що робиться у printfстилі форматування, %04dчастина), і прикріпіть .cсуфікс. В результаті кожної ітерації ми складаємо ім’я на зразок bspl0001.c.

open(my $fh, ">", $var);close($fh)Ефективно діє як touchкоманда, створюючи файл із зазначеним ім'ям.

Хоча трохи тривалий, він працює досить добре, в моді схожий на сценарій пітона Якова Влійма. Він також може бути перетворений в сценарій для читабельності за бажанням, наприклад:

#!/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запуском циклу for, перенаправленням на певний файл. Підхід схожий на однокласник perl з аргументами командного рядка. Хоча 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.