web-dev-qa-db-fra.com

Comment créer plusieurs fichiers avec le terminal?

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.

J'ai besoin d'un moyen de créer plusieurs fichiers tels que bspl0001.c, bspl0002.c, bspl0003.c, etc. et de les enregistrer dans le répertoire "learning_c" ou quelque chose du genre.

Je ne connais pas Ubuntu/Linux et, honnêtement, je ne l’utilise que via VirtualBox car le 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!

39
deranor

Vous pouvez le faire avec ces commandes:

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

Explication:


  • mkdir learning_c

    • Cela créera un dossier appelé learning_c dans le dossier actuel.
    • Le dossier actuel est généralement votre dossier personnel également appelé ~
    • Vous pouvez modifier le répertoire en cours à l’aide de la commande cd (i.e. cd Desktop).
  • cd learning_c

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

    • touch est un outil pour créer des fichiers vides et modifier les horodatages. nous créons des fichiers vides.
    • touch myfile cré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é intéressante du shell bash 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 de Bash Hackers . Dans ce cas, vous ferez une longue liste de paramètres qui seront passés à touch. Vous pouvez également utiliser son équivalent long:

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

    • Les zéros au début (0012 au lieu de 12) garantissent que la sortie utilise des chiffres à 4 chiffres remplis de zéros.
68
Helio

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
    
4
Jacob Vlijm

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

Et puis exécutez-le avec cette commande:

python filecreator.py
3
bolzano

Le nom bash est bon, mais que se passe-t-il si vous travaillez avec un shell qui ne prend pas en charge le développement d'accolade touch file{1..10} ne fonctionne pas pour moi sur mksh par exemple. Voici trois méthodes alternatives qui fonctionnent indépendamment du shell.

seq

Une approche plus neutre vis-à-vis du shell consisterait à associer la commande seq pour générer une séquence de nombres formatés avec des options printf et à la transmettre à la commande xargs. 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 de nom de fichier, index de départ et index de fin. Ensuite, nous utilisons do { } for $ARGV[1] .. $ARGV[2] pour itérer une plage de nombres spécifique. Dites, $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 la fonction sprintf(), nous créons une chaîne m qui scinde le préfixe (premier argument de la ligne de commande, $ARGV[0]) et le nombre donné, mais en remplissant le nombre avec 4 zéros (opération effectuée par printf- style de formatage, %04d partie), et attachez le suffixe .c. En conséquence, à chaque itération, nous créons un nom du type bspl0001.c.

open(my $fh, ">", $var);close($fh) agit effectivement comme une commande touch, 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 à awk, en exécutant une boucle for et en redirigeant vers un fichier spécifique. L’approche est similaire à celle de Perl one-line avec des arguments en ligne de commande. awk est avant tout un utilitaire de traitement de texte, mais 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
2