Comment créer plusieurs fichiers avec le terminal?

31

J’ai appris à programmer avec un livre d’introduction très cool sur C et j’écris chaque exemple et tâche afin 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 comme 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 l’IDE Geany était facile à configurer. Je ne sais donc pas vraiment comment fonctionne le terminal.

    
posée deranor 05.04.2015 - 12:54
la source

4 réponses

56

Vous pouvez le faire avec ces commandes:

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

Explication:

  • mkdir learning_c

    • Ceci 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 changer le répertoire actuel à l'aide de la commande cd (c'est-à-dire cd Desktop )
  • cd learning_c

    • Oui, vous pouvez le deviner, 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 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 permet de créer de longues listes de combinaisons de chaînes arbitraires. Vous pouvez en savoir plus sur ici . Dans ce cas, vous ferez une longue liste de paramètres pour la passer à touch . Vous pouvez également faire son équivalent long:

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

    • Les zéros au début ( 0012 au lieu de 12 ) servent à rendre la sortie de 4 chiffres remplis de zéros.
réponse donnée Helio 05.04.2015 - 13:00
la source
4

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

Pourquoi créer tous les fichiers en même temps? 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éez le fichier correctement nommé (y compris shebang) et
  3. ouvrez le nouveau fichier dans mon éditeur (dans mon cas, inactif).

Touche tout en un. 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 de 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 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 /path/to/create_empty.py
    
réponse donnée Jacob Vlijm 05.04.2015 - 15:09
la source
3

Vous pouvez utiliser le code python suivant et le modifier pour l'adapter à 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
    
réponse donnée bolzano 05.04.2015 - 13:34
la source
2

La méthode bash est bonne, mais que se passe-t-il si vous travaillez avec un shell qui ne supporte pas l'expansion des accolades? touch file{1..10} ne fonctionne pas pour moi sur mksh par exemple. Voici trois méthodes qui fonctionnent indépendamment du shell.

seq

Une approche plus neutre vis-à-vis du shell consisterait à combiner la commande seq pour générer une séquence de nombres au format printf options, puis à 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 sûr, 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 réalité, nous spécifions 3 arguments de ligne de commande: préfixe du 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. Disons que $ARGV[1] avait 5 ans et $ARGV[2] avait 9 ans, 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, nous créons une chaîne m qui sépare 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 printf -style de formatage, %04d part), et attachez le suffixe .c . En conséquence, à chaque itération, nous créons un nom comme bspl0001.c .

Le open(my $fh, ">", $var);close($fh) agit effectivement comme une commande touch , créant un fichier portant 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 également ê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 , exécuter une boucle for et rediriger vers un fichier spécifique. L'approche est similaire à celle de Perl one-liner avec des arguments en ligne de commande. Bien que awk soit avant tout un utilitaire de traitement de texte, il peut néanmoins effectuer une programmation système intéressante.

$ 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
    
réponse donnée Sergiy Kolodyazhnyy 24.10.2015 - 10:11
la source

Lire d'autres questions sur les étiquettes