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


46

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

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

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

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


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

Ответы:


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

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

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

4
Кроме того, чтобы сохранить некоторые нажатия клавиш,touch bspl000{1..3}.c
Рейд

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. ";" поможет вам добавить команды, которые будут выполняться по порядку одна за другой.
Павлос Теодору

4

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

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

  1. есть сценарий, чтобы увидеть в моем каталоге кода, что должно быть "следующий" файл,
  2. создать файл с правильным именем (включая шебанг) ​​и
  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. В разделе head укажите путь к вашему каталогу (и необязательно: измените базовое имя и / или расширение, shebang).
  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-style форматирования, %04dчасть), и прикрепите .cсуффикс. В результате на каждой итерации мы создаем имя как bspl0001.c.

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

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

#!/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.