63 votes

Comment créer plusieurs fichiers avec le Terminal?

J'ai appris à programmer avec un livre d'introduction vraiment cool sur le langage C et j'ai recopié chaque exemple et tâche pour pouvoir apprendre la syntaxe par cœur. J'ai fait chaque fichier manuellement jusqu'à présent, mais cliquer, nommer et enregistrer devient épuisant.

J'ai 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 du genre.

Je suis un débutant avec 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.

éditer Je viens de retomber sur ce vieux compte à moi et je secoue la tête en me demandant pourquoi j'aurais jamais voulu apprendre une syntaxe de code par cœur. Ironiquement, je suis presque fini avec mes études en informatique / mathématiques. Merci beaucoup pour l'aide avec du recul!

110voto

0x2b3bfa0 Points 7873

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_c dans le dossier actuel
    • Le dossier actuel est généralement votre dossier personnel aussi appelé ~
    • Vous pouvez changer le répertoire actuel en utilisant la commande cd (par exemple, cd Desktop)
  • cd learning_c

    • Oui, vous l'avez deviné, vous entrez dans le dossier nouvellement 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 va créer un fichier vide appelé myfile.

    • Le code laid qui suit (bspl{0001..0003}.c) est appelé une expansion entre accolades. Il s'agit d'une excellente fonctionnalité de l'interpréteur de commandes bash qui vous permet de créer de longues listes de combinaisons de chaînes arbitraires. Vous pouvez en apprendre davantage à ce sujet dans le Bash Hackers Wiki. Dans ce cas, vous allez créer 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 exécuter bspl{0001..0012}.c.

    • Les zéros initiaux (0012 au lieu de 12) assurent que la sortie utilise des chiffres sur 4 digits avec des zéros en tête.

5voto

bolzano Points 1432

Vous pouvez utiliser le code python suivant, vous pouvez le modifier pour qu'il corresponde à vos besoins.
Enregistrez le code suivant avec 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 #mettez le nombre que vous souhaitez
for i in range(n):
    subprocess.call(['touch', "bsdl"+str(i).zfill(4)+".c"])

Ensuite, exécutez-le avec cette commande :

python filecreator.py

4voto

Jacob Vlijm Points 78990

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

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

  1. faire en sorte qu'un script voit dans mon répertoire de code quel devrait être le fichier "suivant",
  2. créer le fichier correctement nommé (avec shebang inclus) et
  3. ouvrir le nouveau fichier dans mon éditeur (dans mon cas, Idle).

Tout en une seule pression sur une touche. De cette façon, vous évitez d'avoir beaucoup de fichiers inutilisés; les fichiers ne sont créés que si vous en avez besoin.

Une version simplifiée ci-dessous (ne lançant pas l'étape 3). À chaque pression sur une touche, elle créera un fichier correctement numéroté comme suit :

bspl0001.c, bspl0002.c, bspl0003.c, etc.

#!/usr/bin/env python3
import os
#--- définissez votre répertoire de code ci-dessous
dr = "/chemin/vers/vos/fichiers_de_code"
#--- définissez l'extension de nom (base) désirée et le shebang ci-dessous (laissez-le "" si vous ne voulez pas de shebang défini automatiquement)
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 d'en-tête, définissez le chemin de votre répertoire (et facultatif : changez le nom de base et/ou l'extension, shebang).
  3. Enregistrez le script sous le nom create_empty.py
  4. Exécutez le script à partir d'un raccourci : Paramètres système > Clavier > Raccourcis personnalisés. Ajoutez la commande :

    python3 /chemin/vers/create_empty.py

2voto

Sergiy Kolodyazhnyy Points 97292

La méthode bash est bonne, mais que se passe-t-il si vous travaillez avec un shell qui ne prend pas en charge l'expansion de l'accolade ? touch file{1..10} ne fonctionne pas pour moi sur mksh par exemple. Voici trois façons alternatives qui fonctionnent indépendamment du shell.

seq

Une approche plus neutre en shell serait de combiner la commande seq pour générer une séquence de nombres formatés avec les options de printf, et de la passer à 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 sûr, Perl, étant un outil *nix assez répandu, peut également le faire. La commande spécifique en 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 

Effectivement, ce qui se passe ici est que nous spécifions 3 arguments en 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 sur une plage spécifique de nombres. Disons que $ARGV[1] était 5 et $ARGV[2] était 9, nous itérerions sur 5,6,7,8 et 9.

Ce qui se passe à chaque itération entre les accolades ? nous prenons chaque nombre spécifié avec $_, et en utilisant la fonction sprintf(), nous créons une chaîne qui assemble le préfixe (premier argument de ligne de commande, $ARGV[0]) et le nombre donné, mais en remplissant le nombre de 4 zéros (ce qui est fait par le formatage de type printf, partie %04d), et nous ajoutons le suffixe .c. Résultat : à chaque itération, nous créons un nom comme bspl0001.c.

L'opération open(my $fh, ">", $var);close($fh) agit efficacement comme la commande touch, créant un fichier avec le nom spécifié.

Un peu long mais cela fonctionne assez bien, de manière similaire au script python de Jacob Vlijm. Il peut également être converti en un script pour plus de lisibilité si nécessaire, comme suit :

#!/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 "Impossible d'ouvrir " . $var ;
    close($fh) or die "Impossible de fermer " . $var ;
}

Testons ceci. D'abord la commande en une ligne :

$ 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 serait d'utiliser awk, en exécutant une boucle for, redirigeant vers un fichier spécifique. L'approche est similaire à celle du perl en une ligne avec des arguments en ligne de commande. Bien que awk soit principalement un utilitaire de traitement de texte, il peut tout de même réaliser des programmations système intéressantes.

$ 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

1voto

pymac Points 11

Je suis tombé sur cette page en cherchant quelque chose d'autre... au cas où quelqu'un d'autre doit le faire, je pense que la méthode la plus simple est d'utiliser touch et une boucle for.

for i in {1..10}; do touch file$i.txt; done

Cela créera file1.txt jusqu'à file10.txt dans le répertoire de travail. Bien sûr, vous pouvez également spécifier un répertoire tel que

for i in {60..69}; do touch ./texts/file$i.txt; done

Cela créera file60.txt jusqu'à file69.txt dans le répertoire ./texts

Santé

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X