So benennen Sie Dateien ohne Erweiterung um

So benennen Sie Dateien ohne Erweiterung um

Ich habe eine Reihe von Dateien, die programmgesteuert umbenannt werden sollten, damit sie für die Anwendung verständlich sind.

Sie haben diese Formatierung: Umzubenennende Dateien

Ich muss vom Ende bis zum ersten _ abschneiden und es durch einen Punkt (.) ersetzen.

Da ich weder die Länge des Dateinamens noch die Anzahl der _ im Dateinamen im Voraus kenne, haben Sie irgendeine Idee über awk/sed/cut?

Antwort1

for F in *_*; do echo mv -- "${F}" "${F%_*}.${F##*_}"; done

Wenn die Ausgabe korrekt aussieht, entfernen Sie den echoobigen Befehl.

Der Trick besteht darin, dass ${F%_*}last entfernt wird _26und ${F##*_}alles vor dem letzten entfernt wird _. Probieren Sie diese Befehle aus, um zu sehen, wie es funktioniert. Das Trennzeichen ist jetzt ::

echo "${PATH}"
echo "${PATH%:*}"
echo "${PATH##*:}"
echo "${PATH%:*}_${PATH##*:}"

Antwort2

Verwenden vonsed

for file in *_*
do 
    echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done

Entfernen Sie es echo, wenn Sie zufrieden sind.

Antwort3

Sie können den letzten Block durch ersetzen sed, indem Sie die Zeilenendemarkierung ( $) verwenden.

#/bin/bash
for file in *_* ; do
  #any alphanumeric string as suffix
  mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
  #alternatively numbers only as in given input sample
  mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done

Soweit ich weiß, ist der \{1,\}Teil „eins oder mehrere“ in der vorhergehenden Liste GNU sed– aber ich bin mir bezüglich dieser Einschränkung nicht 100 % sicher.

verwandte Informationen