Como criar vários arquivos com o Terminal?

38

Eu tenho aprendido a programar com um livro introdutório muito legal para C e eu escrevo todos os exemplos e tarefas para que eu possa aprender a sintaxe de cor. Eu fiz todos os arquivos manualmente até agora, mas clicar, nomear e salvar é cansativo.

Eu preciso de uma maneira de criar vários arquivos como bspl0001.c , bspl0002.c , bspl0003.c , etc. e salvá-los no diretório "learning_c" ou algo assim.

Eu sou um noob com Ubuntu / Linux e honestamente só o rodeio via VirtualBox porque o IDE Geany era fácil de configurar. Assim, não sei realmente como funciona o Terminal.

    
por deranor 05.04.2015 / 12:54

4 respostas

66

Você pode fazer isso com estes comandos:

mkdir learning_c
cd learning_c
touch bspl{0001..0003}.c

Explicação:

  • mkdir learning_c

    • Isso criará uma pasta chamada learning_c na pasta atual
    • A pasta atual geralmente é sua pasta pessoal também chamada ~
    • Você pode alterar o diretório atual usando o comando cd (por exemplo, cd Desktop )
  • cd learning_c

    • Sim, você pode adivinhar, está entrando na pasta recém-criada
  • touch bspl{0001..0003}.c

    • touch é uma ferramenta para criar arquivos vazios e modificar timestamps; estamos criando arquivos vazios.
    • touch myfile criará um arquivo vazio chamado myfile .
    • O código feio que segue ( bspl{0001..0003}.c ) é chamado de expansão de chave . Esse é um ótimo recurso do shell bash que permite criar longas listas de combinações arbitrárias de strings. Você pode aprender mais sobre isso no Wiki do Bash Hackers . Nesse caso, você fará uma longa lista de parâmetros que serão passados para touch . Você também pode usar seu equivalente longo:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Você pode alterar o número de arquivos: se quiser 12 arquivos, poderá executar bspl{0001..0012}.c .

    • Os zeros à esquerda ( 0012 em vez de 12 ) garantem que a saída use 4 dígitos preenchidos com zero.
por Helio 05.04.2015 / 13:00
4

Crie um arquivo (próximo) numerado corretamente com uma combinação de teclas de atalho

Por que criar todos os arquivos de uma só vez? A desvantagem é que você terá muitos arquivos vazios e sem uso. O que estou realmente usando: pressione uma combinação de teclas para:

  1. tem um script, veja no meu diretório de código qual deve ser o "próximo" arquivo,
  2. crie o arquivo com o nome correto (incluindo shebang) e
  3. abra o novo arquivo no meu editor (no meu caso Idle).

Tudo em um toque de tecla. Dessa forma, você evita muitos arquivos (ainda) não utilizados; Os arquivos são criados apenas se você precisar deles.

Uma versão simplificada abaixo (não executando a etapa 3). Em cada keypress, ele irá criar um arquivo corretamente numerado como:

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

Como usar

  1. Copie o script em um arquivo vazio
  2. Na seção head, defina o caminho para seu diretório (e opcional: altere o nome base e / ou extensão, shebang).
  3. Salve o script como create_empty.py
  4. Execute o script em um atalho: Configurações do sistema > Teclado > Atalhos Personalizados. Adicione o comando:

    python3 /path/to/create_empty.py
    
por Jacob Vlijm 05.04.2015 / 15:09
3

Você pode usar o seguinte código python, você pode modificá-lo para atender às suas necessidades.
Salve o seguinte código com o nome de arquivo 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"])

E, em seguida, execute-o com este comando:

python filecreator.py
    
por bolzano 05.04.2015 / 13:34
2

O bash way é bom, mas e se você estiver trabalhando com um shell que não suporta a expansão de chaves? touch file{1..10} não funciona para mim em mksh , por exemplo. Aqui estão três maneiras alternativas que funcionam independentemente do shell.

seq

Uma abordagem mais neutra do shell seria combinar o comando seq para gerar a sequência de números formatados com printf options e passá-lo ao comando xargs . Por exemplo,

$ 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

É claro que o Perl, sendo uma ferramenta widespred * nix, também pode fazer isso. O comando de uma linha específica que temos aqui é o seguinte:

perl -le 'do { $var=sprintf("%s%04d.c",$ARGV[0],$_ ); open(my $fh, ">", $var);close($fh) } for $ARGV[1] .. $ARGV[2]' bslp 1 5 

Efetivamente, o que acontece aqui é que especificamos 3 argumentos de linha de comando: prefixo de nome de arquivo, índice inicial e índice final. Em seguida, usamos do { } for $ARGV[1] .. $ARGV[2] para iterar para um intervalo específico de números. Digamos, $ARGV[1] foi 5 e $ARGV[2] foi 9, nós iteraríamos acima de 5,6,7,8 e 9.

O que acontece em cada iteração dentro das chaves? tomamos cada número especificado com $_ , e usando sprintf() function criamos uma string m que emende o prefixo (primeiro argumento de linha de comando, $ARGV[0] ) e o número dado, mas preenche o número com 4 zeros ( que é feito por printf -style de formatação, %04d part) e anexe o sufixo .c . Como resultado em cada iteração, criamos um nome como bspl0001.c .

O open(my $fh, ">", $var);close($fh) atua efetivamente como touch , criando um arquivo com o nome especificado.

Apesar de um pouco longo, ele funciona muito bem, de forma semelhante ao script python de Jacob Vlijm. Ele também pode ser convertido em um script para legibilidade, se desejado, da seguinte forma:

#!/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 ;
}

Vamos testar isso. Primeiro o one-liner:

$ 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

E agora o script:

$ 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

Outra abordagem seria com awk , executando um loop for, redirecionando para um arquivo específico. A abordagem é semelhante ao perl one-liner com argumentos de linha de comando. Enquanto awk é principalmente um utilitário de processamento de texto, ainda pode fazer alguma programação de sistema legal.

$ 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
    
por Sergiy Kolodyazhnyy 24.10.2015 / 10:11