Ich habe ein Bash-Skript, mit dem ich versuche, Punkte in Dateinamen zu ersetzen und durch Unterstriche zu ersetzen, wobei die Erweiterung intakt bleibt (ich bin übrigens auf Centos 6). Wie Sie der folgenden Ausgabe entnehmen können, funktioniert das Skript, wenn ein Punkt ersetzt werden muss. In Fällen, in denen der einzige Punkt die Erweiterung ist, versucht das Skript dennoch, die Datei umzubenennen, anstatt sie zu ignorieren. Kann jemand darauf hinweisen, wie ich besser damit umgehen soll? Vielen Dank für jede Hilfe.
Mein (fehlerhaftes) Skript:
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Beispieleingabe:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Ausgabe:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
Dateien? Sie möchten, dass sie sich auflösenfile.tar.gz
, nichtfile_tar.gz
.Antworten:
Ich glaube, dass dieses Programm tun wird, was Sie wollen. Ich habe es getestet und es funktioniert in mehreren interessanten Fällen (z. B. überhaupt keine Erweiterung):
Das Hauptproblem, das Sie hatten, war, dass die
##
Erweiterung nicht das tat, was Sie wollten. Ich habe die Erweiterung der Shell-Parameter in Bash immer als eine Art schwarze Kunst angesehen. Die Erklärungen im Handbuch sind nicht ganz klar und es fehlen unterstützende Beispiele dafür, wie die Erweiterung funktionieren soll. Sie sind auch ziemlich kryptisch.Persönlich hätte ich ein kleines Skript geschrieben
sed
, das den Namen so fummelte, wie ich es wollte, oder ein kleines Skript geschriebenperl
, das einfach das Ganze tat. Eine der anderen Personen, die geantwortet haben, hat diesen Ansatz gewählt.Eine andere Sache, auf die ich hinweisen möchte, ist meine Verwendung von Zitaten. Jedes Mal, wenn ich etwas mit Shell-Skripten mache, erinnere ich die Leute daran, sehr vorsichtig mit ihren Zitaten umzugehen. Eine große Ursache für Probleme in Shell-Skripten ist die Shell, die Dinge interpretiert, die sie nicht soll. Und die Angebotsregeln sind alles andere als offensichtlich. Ich glaube, dieses Shell-Skript ist frei von Zitierproblemen.
quelle
Verwenden Sie
for thisfile in *.*.*
(dh durchlaufen Sie Dateien mit zwei oder mehr Punkten im Namen). Denken Sie daran, Ihre Variablen in Anführungszeichen--
zu setzen und das Ende der Optionen wie in zu markierenmv -- "$thisfile" "$newname.$extension"
Mit zsh.
quelle
Wie wäre es damit:
HAFTUNGSAUSSCHLUSS: Versuchen Sie es zuerst in einem Dummy-Verzeichnis, ich habe es nicht getestet!
quelle
/
.Es sieht so aus, als ob einige gute Antworten bereits verfügbar sind, aber hier ist eine andere Verwendung von
tr
undsed
:quelle
sed
entscheidet man, auf was.*
man maximal kaut? Ich würde viel besser fühlt darüber , wenn der zweite.*
war[^_]*
.\t
Zeichen darin zurückzuführen ist.echo -n "$file"
würde funktionieren. :-) Oh, und es geht"
um den$( ... )
Ausdruck (aka"$( ... )"
) würde es tun.In dieser Version können Sie explizit die Anzahl der Punkte auswählen, die Sie behalten möchten, beginnend auf der rechten Seite.
Außerdem werden zusätzlich zu den Punkten andere Zeichen ersetzt und / oder gelöscht, und das Ersatzzeichen wird
-
anstelle eines Unterstrichs verwendet. Dies kann jedoch leicht geändert werden.quelle