Как создать несколько файлов с Терминалом?
Я учился программировать с действительно классной вводной книгой для C, и я записываю каждый пример и задачу, чтобы я мог выучить синтаксис наизусть. До сих пор я делал каждый файл вручную, но клики, присвоение имен и сохранение становятся утомительными.
Мне нужен способ для создания нескольких файлов, таких как bspl0001.c
, bspl0002.c
, bspl0003.c
и т. д. и сохраняя их в каталоге "learning_c" или что-то в этом роде.
Я новичок в Ubuntu / Linux и, честно говоря, запускаю его только через VirtualBox, потому что IDE Geany было легко настроить. Таким образом, я действительно не знаю, как работает Терминал.
Я только что нашел себя в этом старом аккаунте и качаю головой о том, почему я хотел бы выучить синтаксис кода наизусть. Как ни странно, я почти закончил обучение в CS / Math BSc. Большое спасибо за помощь в ретроспективе!
5 ответов
Вы можете сделать это с помощью этих команд:
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 цифры, дополненные нулями.
Вы можете использовать следующий код 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). При каждом нажатии клавиши он будет создавать файл с правильной нумерацией, например:
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
Как пользоваться
- Скопируйте скрипт в пустой файл
- В разделе head укажите путь к вашему каталогу (и необязательно: измените базовое имя и / или расширение, shebang).
- Сохраните скрипт как create_empty.py
Запустите скрипт из ярлыка: "Системные настройки"> "Клавиатура"> "Пользовательские ярлыки". Добавьте команду:
python3 /path/to/create_empty.py
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
команда, создающая файл с указанным именем.
Несмотря на то, что он немного длинный, он работает довольно хорошо, в моде похож на сценарий Якоба Влиима на 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
Просто наткнулся на эту страницу в поисках чего-то еще ... на случай, если кому-то еще понадобится это сделать, я думаю, что проще всего использовать касание и цикл for.
for i in {1..10}; do touch file$i.txt; done
Что создаст файлы от file1.txt до file10.txt в рабочем каталоге. Конечно, вы также можете указать каталог, например
for i in {60..69}; do touch ./texts/file$i.txt; done
Что создаст файл от 60.txt до file69.txt в каталоге ./texts.
Ваше здоровье