Comment créer plusieurs fichiers avec le terminal?

46

J'ai appris à programmer avec un livre d’introduction très cool sur C et j’écris chaque exemple et tâche pour que je puisse apprendre la syntaxe par cœur. J'ai fait tous les fichiers manuellement jusqu'à maintenant, mais les clics, les noms et les sauvegardes sont épuisants.

Je besoin d' un moyen de créer plusieurs fichiers comme bspl0001.c, bspl0002.c, bspl0003.c, etc. , et de les enregistrer dans le répertoire « learning_c » ou quelque chose.

Je ne connais pas Ubuntu / Linux et, honnêtement, je ne l’utilise que via VirtualBox car l’IDE ​​Geany était facile à configurer. Ainsi, je ne sais pas vraiment comment fonctionne le terminal.

edit Je viens de me retrouver dans mon ancien compte et je me demande pourquoi je ne voudrais jamais apprendre une syntaxe de code par cœur. Curieusement, j'ai presque fini mes études de licence en sciences et mathématiques. Merci beaucoup pour l'aide avec le recul!

déraneur
la source
1
Pourquoi créer tous les fichiers à la fois? Ce que j'utilise réellement: appuyez sur une combinaison de touches pour 1. voir dans mon répertoire de code ce qui devrait être le fichier "suivant", 2. créer le fichier correctement nommé (y compris shebang) et 3. l'ouvrir dans mon éditeur (dans mon cas Tourner au ralenti). Tout en un presse. De cette façon, vous évitez beaucoup de fichiers (encore) inutilisés.
Jacob Vlijm

Réponses:

77

Vous pouvez le faire avec ces commandes:

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

Explication:


  • mkdir learning_c

    • Cela va créer un dossier appelé learning_cdans le dossier actuel
    • Le dossier actuel est généralement votre dossier personnel également appelé ~
    • Vous pouvez changer le répertoire courant en utilisant la cdcommande (ie cd Desktop)
  • cd learning_c

    • Oui, vous pouvez le deviner, vous entrez dans le nouveau dossier créé
  • touch bspl{0001..0003}.c

    • touchest un outil pour créer des fichiers vides et modifier les horodatages; nous créons des fichiers vides.
    • touch myfilecréera un fichier vide appelé myfile.
    • Le code laid qui suit ( bspl{0001..0003}.c) est appelé une extension d'accolade . C'est une fonctionnalité bashintéressante du shell qui vous permet de créer de longues listes de combinaisons de chaînes arbitraires. Vous pouvez en apprendre plus à ce sujet dans le Wiki Bash Hackers . Dans ce cas, vous ferez une longue liste de paramètres qui seront transmis à touch. Vous pouvez également utiliser son équivalent long:

      touch bspl0001.c bspl0002.c bspl0003.c
      
    • Vous pouvez changer le nombre de fichiers: si vous voulez 12 fichiers, vous pouvez les exécuter bspl{0001..0012}.c.

    • Les zéros à gauche ( 0012au lieu de 12) s'assurent que la sortie utilise 4 chiffres zéros .
Hélio
la source
4
Alternativement, pour sauver quelques frappes,touch bspl000{1..3}.c
Reid le
1
@Reid: Et qu'arrive-t-il si Herios veut 10 fichiers ou plus?
Helio
3
Pour ceux qui veulent créer une liste de fichiers avec la même extensiontouch {test,tes2,tes3}.js
Rick
1
@Rick: N'est-ce pas ce que je réponds? ;-) . Votre code peut être simplifié:touch tes{t,2,3}.js
Helio
1
et vous pouvez également le faire en une seule ligne de commande: $ mkdir learning_c; cd learning_c; appuyez sur bspl000 {1,2,3,4} .c. Le ";" vous aidera à ajouter des commandes qui s'exécuteront dans l'ordre, l'une après l'autre.
Pavlos Theodorou
4

Créer un fichier correctement numéroté (suivant) avec une combinaison de touches de raccourci

Pourquoi créer tous les fichiers à la fois? L'inconvénient est que vous aurez beaucoup de fichiers vides et inutilisés. Ce que j'utilise réellement: appuyez sur une combinaison de touches pour:

  1. avoir un script voir dans mon répertoire de code ce qui devrait être le "prochain" fichier,
  2. créer le fichier correctement nommé (y compris shebang) et
  3. ouvrez le nouveau fichier dans mon éditeur (dans mon cas, Idle).

Tout en un presse. De cette façon, vous évitez beaucoup de fichiers (encore) inutilisés; Les fichiers ne sont créés que si vous en avez besoin.

Une version simplifiée ci-dessous (ne pas exécuter l'étape 3). À chaque pression sur une touche, un fichier correctement numéroté sera créé, tel que:

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

Comment utiliser

  1. Copiez le script dans un fichier vide
  2. Dans la section head, définissez le chemin d'accès à votre répertoire (et facultatif: modifiez le nom de la base et / ou l'extension, shebang).
  3. Enregistrez le script sous create_empty.py.
  4. Exécutez le script à partir d'un raccourci: Paramètres système> Clavier> Raccourcis personnalisés. Ajoutez la commande:

    python3 /path/to/create_empty.py
    
Jacob Vlijm
la source
3

Vous pouvez utiliser le code python suivant, vous pouvez le modifier pour répondre à vos besoins.
Enregistrez le code suivant avec le nom de fichierfilecreator.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"])

Et puis exécutez-le avec cette commande:

python filecreator.py
Bolzano
la source
2

La bashvoie est bonne, mais que se passe-t-il si vous travaillez avec une coque qui ne supporte pas l'expansion des accolades? touch file{1..10}ne fonctionne pas pour moi mkshpar exemple. Voici trois manières alternatives qui fonctionnent indépendamment du shell.

seq

Une approche plus neutre vis-à-vis du shell consisterait à combiner seqcommande pour générer une séquence de nombres formatés avec des printfoptions et à la passer à xargscommande. Par exemple,

$ 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

Bien entendu, Perl, en tant qu'outil assez large *, peut également le faire. La commande spécifique à une ligne que nous avons ici est la suivante:

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

En pratique, nous spécifions 3 arguments de ligne de commande: préfixe du nom de fichier, index de départ et index de fin. Nous utilisons ensuite do { } for $ARGV[1] .. $ARGV[2]pour itérer une plage de nombres spécifique. Disons, $ARGV[1]était 5 et $ARGV[2]était 9, nous itérerions plus de 5,6,7,8 et 9.

Que se passe-t-il à chaque itération dans les accolades? nous prenons chaque nombre spécifié avec $_, et en utilisant sprintf()function, créez une chaîne m qui relie le préfixe (premier argument de ligne de commande $ARGV[0]) et le nombre donné, mais en remplissant le nombre avec 4 zéros (ce qui est fait par le printfstyle de formatage, %04dpartie), et fixer les .csuffix.As un résultat à chaque itération , nous faisons un nom comme bspl0001.c.

Le open(my $fh, ">", $var);close($fh)agit efficacement en tant que touchcommande, créant un fichier avec le nom spécifié.

Bien que légèrement long, il fonctionne assez bien, à la manière du script python de Jacob Vlijm. Il peut aussi être converti en script pour plus de lisibilité, comme ceci:

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

Permet de tester cela. D'abord le 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

Et maintenant le 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

Une autre approche consisterait à awkexécuter une boucle for et à rediriger vers un fichier spécifique. L'approche est similaire à celle de Perl one-line avec des arguments en ligne de commande. Bien awkqu’il s’agisse avant tout d’un utilitaire de traitement de texte, il peut encore faire de la programmation système.

$ 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
la source