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

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

Мне нужен способ создать несколько файлов, таких как bspl0001.c, bspl0002.c, bspl0003.c и т.д. и сохраняем их в каталоге "learning_c" или что-то в этом роде.

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

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

Вы можете сделать это с помощью следующих команд:

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

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

    • Начальные нули (0012 вместо 12) убедитесь, что на выходе используются 4 цифры с добавлением нуля.

Вы можете использовать следующий код python, вы можете изменить его в соответствии с вашими потребностями.
Сохраните следующий код с именем файла filecreator.py

#!/usr/bin/env pythonimport osimport subprocesswork_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 wishfor i in range(n):    subprocess.call(['touch', "bsdl"+str(i).zfill(4)+".c"])

А затем выполните его с помощью этой команды:

python filecreator.py

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

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

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

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

Упрощенная версия ниже (не выполняется шаг 3). При каждом нажатии клавиши он создаст правильно пронумерованный файл, например:

bspl0001.c, bspl0002.c, bspl0003.c etc
#!/usr/bin/env python3import os#--- set your code directory belowdr = "/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 = 1while 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. В разделе head укажите путь к вашему каталогу (и необязательно: измените базовое имя и/или расширение, shebang).
  3. Сохраните сценарий как create_empty.py
  4. >>Запустите скрипт с помощью ярлыка: Системные настройки, Пользовательские сочетания клавиш. Добавьте команду:

    python3 /path/to/create_empty.py

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

след.

Более нейтральным к оболочке подходом было бы объединить seq команда для генерации последовательности чисел, отформатированных с помощью printf параметры и передайте его в xargs команда. Например,

$ ls -ltotal 0$ seq -f "%04.0f" 10 | xargs -I "{}" touch bspl"{}".c                 $ lsbspl0002.c  bspl0004.c  bspl0006.c  bspl0008.c  bspl0010.cbspl0001.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 команда, создающая файл с указанным именем.

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

#!/usr/bin/env perluse 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 -ltotal 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 -ltotal 4-rwxrwxr-x 1 xieerqi xieerqi 244 2月   5 23:57 touch_range.pl*$ ./touch_range.pl bspl 1 5                                                                           $ ls -ltotal 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

Зачем создавать все файлы сразу? Что я на самом деле использую: нажмите комбинацию клавиш, чтобы 1. посмотреть в моем каталоге кода, каким должен быть файл “next”, 2. создать файл с правильным именем (включая shebang) и 3. открыть его в моем редакторе (в моем случае Idle). Все это одним нажатием клавиши. Таким образом, вы предотвратите большое количество (все еще) неиспользуемых файлов.