¿Cómo crear múltiples archivos con la Terminal?

46

He estado aprendiendo a programar con un libro introductorio realmente genial para C y escribo cada ejemplo y cada tarea para poder aprender la sintaxis de memoria. Hice todos los archivos manualmente hasta ahora, pero hacer clic, nombrar y guardar se vuelve agotador.

Necesito una manera de crear varios archivos como bspl0001.c, bspl0002.c, bspl0003.c, etc, y guardarlos en el directorio "learning_c" o algo así.

Soy un novato con Ubuntu / Linux y honestamente solo lo ejecuto a través de VirtualBox porque el IDE Geany fue fácil de configurar. Por lo tanto, no sé realmente cómo funciona la Terminal.

editar Me acabo de encontrar en esta antigua cuenta mía y estoy sacudiendo la cabeza sobre por qué querría aprender una sintaxis de código de memoria. Curiosamente, casi termino con mis estudios de CS / Math BSc. Muchas gracias por la ayuda en retrospectiva!

deranor
fuente
1
¿Por qué crear todos los archivos a la vez? Lo que realmente estoy usando: presione una combinación de teclas para 1. ver en mi directorio de códigos cuál debería ser el archivo "siguiente", 2. crear el archivo con el nombre correcto (incluido shebang) y 3. abrirlo en mi editor (en mi caso Ocioso). Todo en una pulsación de tecla. De esa forma, evita muchos archivos (aún) no utilizados.
Jacob Vlijm

Respuestas:

77

Puede hacer esto con estos comandos:

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

Explicación:


  • mkdir learning_c

    • Esto creará una carpeta llamada learning_cen la carpeta actual
    • La carpeta actual generalmente es su carpeta de inicio también llamada ~
    • Puede cambiar el directorio actual con el cdcomando (es decir cd Desktop)
  • cd learning_c

    • Sí, puedes adivinar, estás ingresando en la carpeta recién creada
  • touch bspl{0001..0003}.c

    • touches una herramienta para crear archivos vacíos y modificar marcas de tiempo; Estamos creando archivos vacíos.
    • touch myfilecreará un archivo vacío llamado myfile.
    • El código feo que sigue ( bspl{0001..0003}.c) se llama expansión de llaves . Esta es una gran característica del bashshell que le permite crear largas listas de combinaciones de cadenas arbitrarias. Puede obtener más información sobre esto en Bash Hackers Wiki . En este caso, hará una larga lista de parámetros a los que se pasará touch. También puede usar su equivalente largo:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Puede cambiar la cantidad de archivos: si desea 12 archivos, puede ejecutarlos bspl{0001..0012}.c.

    • Los ceros iniciales (en 0012lugar de 12) se aseguran de que la salida utilice 4 dígitos rellenados con ceros.
Helio
fuente
44
Alternativamente, para guardar algunas pulsaciones de teclas,touch bspl000{1..3}.c
Reid
1
@Reid: ¿Y qué sucede si Herios quiere 10 o más archivos?
Helio
3
Para aquellos que quieran crear una lista de archivos con la misma extensióntouch {test,tes2,tes3}.js
Rick
1
@ Rick: ¿No es lo que respondo? ;-) . Su código puede ser simplificado:touch tes{t,2,3}.js
Helio
1
y también puede hacerlo en una línea de comando: $ mkdir learning_c; cd learning_c; toque bspl000 {1,2,3,4} .c. Los ";" le ayudará a agregar comandos que se ejecutarán en orden uno tras otro.
Pavlos Theodorou
4

Cree un archivo numerado correctamente (siguiente) con una combinación de teclas de acceso directo

¿Por qué crear todos los archivos a la vez? La desventaja es que tendrá muchos archivos vacíos y sin usar. Lo que realmente estoy usando: presione una combinación de teclas para:

  1. hacer que un script vea en mi directorio de códigos cuál debería ser el archivo "siguiente",
  2. crear el archivo con el nombre correcto (incluido shebang) y
  3. abra el nuevo archivo en mi editor (en mi caso, inactivo).

Todo en una pulsación de tecla. De esa forma, evita muchos archivos (aún) no utilizados; Los archivos solo se crean si los necesita.

Una versión simplificada a continuación (no ejecuta el paso 3). En cada pulsación de tecla, creará un archivo numerado correctamente 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

Cómo utilizar

  1. Copie el script en un archivo vacío
  2. En la sección de cabecera, configure la ruta a su directorio (y opcional: cambie el nombre base y / o la extensión, shebang).
  3. Guarde el script como create_empty.py
  4. Ejecute el script desde un acceso directo: Configuración del sistema> Teclado> Accesos directos personalizados. Agrega el comando:

    python3 /path/to/create_empty.py
    
Jacob Vlijm
fuente
3

Puede usar el siguiente código de Python, puede modificarlo para adaptarlo a sus necesidades.
Guarde el siguiente código con nombre de archivofilecreator.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"])

Y luego ejecútelo con este comando:

python filecreator.py
bolzano
fuente
2

El bashcamino es bueno, pero ¿qué pasa si está trabajando con un shell que no admite la expansión de llaves? touch file{1..10}no funciona para mí, mkshpor ejemplo. Aquí hay tres formas alternativas que funcionan independientemente del shell.

seq

Un enfoque más neutral para la shell sería combinar el seqcomando para generar una secuencia de números formateados con printfopciones y pasarlo al xargscomando. Por ejemplo,

$ 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

Por supuesto, Perl, al ser una herramienta bastante amplia * nix, también puede hacerlo. El comando específico de una línea que tenemos aquí es el siguiente:

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

Efectivamente, lo que sucede aquí es que especificamos 3 argumentos de línea de comandos: prefijo de nombre de archivo, índice inicial e índice final. Luego, usamos do { } for $ARGV[1] .. $ARGV[2]para iterar para un rango específico de números. Digamos que $ARGV[1]tenía 5 y $ARGV[2]9, iteraríamos sobre 5,6,7,8 y 9.

¿Qué sucede en cada iteración dentro de las llaves? tomamos cada número especificado con $_, y usando la sprintf()función creamos una cadena m que divide el prefijo (primer argumento de la línea de comando $ARGV[0]) y el número dado, pero completa el número con 4 ceros (que se hace por printfestilo de formato, %04dparte), y adjunte el .csufijo. Como resultado de cada iteración creamos un nombre como bspl0001.c.

El open(my $fh, ">", $var);close($fh)efectivamente actúa como touchcomando, creando un archivo con un nombre especificado.

Aunque es un poco largo, funciona bastante bien, de manera similar al script de python de Jacob Vlijm. También se puede convertir a un script para facilitar la lectura si lo desea, de esta manera:

#!/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 a probar esto. Primero el 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

Y ahora el guión:

$ 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

Otro enfoque sería awk, ejecutando un bucle for, redirigiendo a un archivo específico. El enfoque es similar al perl one-liner con argumentos de línea de comandos. Si bien awkes principalmente una utilidad de procesamiento de texto, aún puede hacer una programación genial del sistema.

$ 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
Sergiy Kolodyazhnyy
fuente