Как создать несколько файлов с Терминалом?

Я учился программировать с действительно классной вводной книгой для C, и я записал каждый пример и задачу, чтобы я мог выучить синтаксис наизусть. До сих пор я делал каждый файл вручную, но клики, присвоение имен и сохранение становятся утомительными.

Мне нужен способ создать несколько файлов, таких как bspl0001.c, bspl0002.c, bspl0003.c и т. Д., И сохранить их в каталоге «learning_c» или в другом месте.

Я новичок в Ubuntu / Linux и, честно говоря, запускаю его только через VirtualBox, потому что IDE Geany было легко настроить. Таким образом, я действительно не знаю, как работает Терминал.

edit Я только что оказался в этом старом аккаунте и качаю головой о том, почему я хотел бы выучить синтаксис кода наизусть. Как ни странно, я почти закончил обучение в CS / Math BSc. Большое спасибо за помощь в ретроспективе!

46
задан 30 May 2019 в 20:47

4 ответа

Можно сделать это с этими командами:

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 Wiki. В этом случае Вы будете составлять длинный список параметров, которые будут переданы touch. Можно также использовать его длинный эквивалент:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Можно изменить количество файлов: если Вы хотите 12 файлов, можно работать bspl{0001..0012}.c.

    • Начальные нули (0012 вместо 12) удостоверьтесь, что вывод использует дополненный нулем 4 цифры.
78
ответ дан 30 May 2019 в 20:47

Создайте правильно пронумерованный (следующий) файл с комбинацией сочетания клавиш

, Почему создают все файлы сразу? Недостаток - то, что у Вас будет много пустых и неиспользованных файлов. Что я на самом деле использую: нажмите сочетание клавиш к:

  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
    
4
ответ дан 30 May 2019 в 20:47

Можно использовать следующий код 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
3
ответ дан 30 May 2019 в 20:47

bash путь хорош, но что, если Вы работаете с оболочкой, которая не поддерживает изогнутое расширение фигурной скобки? touch file{1..10} не работает на меня на mksh например. Вот три альтернативных пути, которые работают независимо от оболочки.

seq

Более нейтральный в отношении оболочки подход должен был бы объединиться 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, который соединяет префикс (первый параметр командной строки, $ARGV[0]) и данное число, но заполнение числа с 4 нулями (который сделан printf- стиль форматирования, %04d часть), и присоединение .c суффикс. В результате на каждом повторении мы составляем имя как bspl0001.c.

open(my $fh, ">", $var);close($fh) эффективно действия как touch команда, создавая файл с указанным именем.

В то время как немного длинный это работает вполне хорошо, в моде подобный сценарию Python 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, выполнение для цикла, перенаправляя в определенный файл. Подход является аналогичным остроте жемчуга с параметрами командной строки. В то время как 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
2
ответ дан 30 May 2019 в 20:47

Другие вопросы по тегам:

Похожие вопросы: