J'ai ce script
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Cela fonctionne, juste que, pour un fichier nommé 001.png
, il crée à la 001.png.txt
place de 001.txt
.
Comment puis-je modifier cela?
for filePng in "$folder"/*
ettouch "$filePng".txt
- notez que vous ne les citez que lorsqu'ils sont précédés d'un$
.Réponses:
Vous pouvez utiliser la
basename
commande ici:Notez les supplémentaires
$folder/
. Ceci est nécessaire car la commande basename supprime le chemin d'accès.la source
$filePng
- ils étaient également utiles.$( )
établit un nouveau contexte de citation.Vous pouvez supprimer l'extension existante à l'aide des fonctionnalités d' extension des paramètres du shell
Donc dans votre cas, remplacez
$filePng.txt
par"${filePng%.png}.txt"
la source
Avec des variations sur ce que Steeldriver a déjà mentionné - l'expansion des paramètres - nous pouvons utiliser le remplacement de chaîne pour faire le travail. De plus, vous devez citer des variables. Vous trouverez ci-dessous votre script modifié.
la source
Si vous avez beaucoup de fichiers à créer, il vaudrait la peine de «toucher» plus d'un fichier à la fois, de sorte que vous n'avez pas besoin de créer un nouveau processus pour chacun d'entre eux (ce qui prend un certain temps s'il est exécuté plusieurs fois). mille fois).
Option 1: substitution de modèle +
xargs
Cette option fournira plusieurs chemins d'accès à la
touch
commande à la fois, généralement quelques milliers ou tout ce que le système peut contenir sur une seule ligne de commande.Option 2: extension des paramètres + redirection de la sortie des commandes
Cette option ne s'exécute pas
touch
du tout, mais utilise à la place les fonctionnalités du shell Bash / Bourne / POSIX qui ne nécessitent aucun sous-processus.la source
Si vous êtes sûr de ne pas avoir de fichiers avec
.png
quelque part au milieu du nom, vous pouvez simplement utiliser un tableau avec une extension de paramètre:Cela stocke tous les chemins d'accès aux fichiers se terminant par
.png
un tableau, puis utilise l'expansion des paramètres pour créer la liste des.txt
fichiers, en les remplaçant.png
par.txt
chacun d'eux.Gardez à l'esprit que cela se cassera si vous avez tellement de fichiers qu'ils ne peuvent pas tous être passés en arguments à la même invocation de
touch
.la source