Ich habe dieses Skript
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Es funktioniert nur, dass es für eine Datei namens 001.png
erstellt, 001.png.txt
anstatt 001.txt
.
Wie kann ich das ändern?
for filePng in "$folder"/*
undtouch "$filePng".txt
- beachten, dass Sie sie nur zitieren, wenn ein vorangestelltes$
.Antworten:
Sie können den
basename
Befehl hier verwenden:Beachten Sie die zusätzlichen
$folder/
. Dies ist erforderlich, da der Befehl basename den Pfad von entfernt.quelle
$filePng
- sie waren auch nützlich.$( )
es einen neuen Kontext für Zitate schafft .Sie können die vorhandene Erweiterung mit der Shell entfernen Parameter Erweiterungsfunktionen
Also in Ihrem Fall ersetzen
$filePng.txt
mit"${filePng%.png}.txt"
quelle
Bei Variation dessen, was der Stahltreiber bereits erwähnt hat - Parametererweiterung - können wir String-Ersetzungen verwenden, um die Arbeit zu erledigen. Zusätzlich sollten Sie Variablen zitieren. Unten sehen Sie Ihr bearbeitetes Skript.
quelle
Wenn Sie viele Dateien erstellen müssen, lohnt es sich, mehrere Dateien gleichzeitig zu „berühren“, damit Sie nicht für jede Datei einen neuen Prozess erstellen müssen (was bei mehreren Vorgängen einige Zeit in Anspruch nimmt) tausendmal).
Option 1: Mustersubstitution +
xargs
Diese Option liefert mehrere Pfade gleichzeitig zum
touch
Befehl, normalerweise einige Tausend oder was auch immer das System auf eine einzelne Befehlszeile passen kann.Option 2: Parametererweiterung + Befehlsausgabeumleitung
Diese Option wird überhaupt nicht ausgeführt,
touch
sondern verwendet stattdessen die Bash / Bourne / POSIX-Shell-Funktionen, für die überhaupt keine Unterprozesse erforderlich sind.quelle
Wenn Sie sicher sind, dass sich keine Dateien
.png
in der Mitte des Namens befinden, können Sie einfach ein Array mit Parametererweiterung verwenden:Dadurch werden alle Pfade zu den Dateien gespeichert, die in
.png
einem Array enden. Anschließend wird mithilfe der Parametererweiterung die Liste der.txt
Dateien erstellt, indem.png
für.txt
jede einzelne Datei ein Ersatz verwendet wird .Beachten Sie, dass dies fehlschlägt, wenn Sie so viele Dateien haben, dass nicht alle als Argumente an denselben Aufruf von übergeben werden können
touch
.quelle