Wie kann ich entfernen Sie die Erweiterung des Dateinamens in ein shell-Skript?
Was ist falsch mit dem folgenden code?
name='$filename | cut -f1 -d'.''
Da ist, bekomme ich die Zeichenkette $filename | cut -f1 -d'.'
, aber wenn ich entfernen Sie die Zitate, die ich bekomme gar nichts. Mittlerweile Typisierung
"test.exe" | cut -f1 -d'.'
in einer shell gibt mir den output, den ich will, test
. Ich weiß schon $filename
zugewiesen wurde der richtige Wert. Was ich will zu tun ist, weisen Sie einer Variablen den Dateinamen ohne die Erweiterung.
basename $filename .exe
würde das gleiche tun. Das ist vorausgesetzt, Sie wissen immer, was die Erweiterung, die Sie entfernen möchten.- du meinst
basename "$filename" .exe
. Ansonsten Dateinamen mit Leerzeichen wäre eine schlechte Nachricht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie mit Hilfe der Kommando-substitution syntax
$(command)
wenn Sie möchten, führen Sie einen Befehl im script/Befehl.Damit deine line wäre
Code Erklärung:
echo
den Wert der Variablen$filename
aus und senden Sie es an die Standardausgabecut
Befehlcut
verwenden . als Trennzeichen (auch bekannt als Trennzeichen) für das schneiden der string in Segmente und durch-f
wir wählen Sie, welches segment wollen wir in Ausgabe$()
Kommando-substitution werden die Ausgabe und die Rückgabe seines Wertesname
Beachten Sie, dass dies der Teil von der variable bis zur ersten Periode
.
:echo $filename | cut -f1 -d'.'
$()
bevorzugt.Können Sie auch verwenden, parameter expansion:
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Danke.image.png.gz
?%.*
entfernt nur die Letzte extension; wenn Sie entfernen möchten, alle die Erweiterungen, verwenden Sie%%.*
.Wenn Sie wissen, die Erweiterung, die Sie verwenden können, basename
.wiki
und am Ende mit/home/jsmith/base
?Wenn Ihr Dateiname enthält einen Punkt (andere als die von der Erweiterung), dann verwenden Sie diesen:
je nachdem, was Sie wollen. Hier nehme ich an, dass Letzte
.
(Punkt) gefolgt von text-Erweiterung.Wie bereits von Hawker65 in dem Kommentar von chepner Antwort, die die meisten gestimmt Lösung weder kümmern sich um mehrere Erweiterungen (wie filename.tar.gz), noch von Punkten in den rest des Pfades (wie dieses.Weg/mit.dots/in.Pfad.name).
Eine mögliche Lösung ist:
Meine Empfehlung ist die Verwendung von basename.
Es ist standardmäßig in ubuntu, optisch einfachen code, und befassen sich mit die Mehrheit der Fälle.
Hier sind einige subcases Umgang mit Räumen und multidot/sub-extension:
pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(/|.)}
normalerweise ist es loszuwerden, die Erweiterung von der ersten . aber nicht in unserem Weg ..
echo "$(basename "${pathfile%.*}")"
Raum -Datei.tar # ich glaube, wir brauchten exatly, dass
Ist hier ein wichtiger Hinweis: ich habe die doppelten Anführungszeichen innerhalb von doppelten Anführungszeichen Umgang mit Leerzeichen.
Apostroph wird nicht passieren wegen SMS des $. Bash ist ungewöhnlich und liest "zweite "erste" Zitate" aufgrund der expansion.
Jedoch, Sie müssen noch zu denken .hidden_files
hidden="~/.bashrc"
echo "$(basename "${verborgene%.}")" # erzeugen wird, die "~" !!!
nicht das erwartete " - " Ergebnis. Um Sie geschehen verwenden Sie $HOME oder in /home/user_path/
weil wieder bash ist "ungewöhnlich" und nicht erweitern "~" (Suche nach bash BashPitfalls)
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.}")'
Zwei Probleme mit dem code:
Ich würde den code ändern "name=`echo $filename | cut-f 1 -d '.' `", wie unten gezeigt (beachten Sie wieder den Rücken Zecken rund um die name-variable-definition):
Ausgänge:
Ausgänge:
Beachten Sie, dass nur die Letzte Erweiterung entfernt wird.