1) Ein Script für‘s Kontextmenü des Dateimanagers zu Bereinigung einzelner Datei- und Ordnernamen.
Je nach Voreinstellung wird aus so einem Dateinamen:
--▶ Køttbuller® 'heißen' ♥-Fleisch-bällchen [31.03.2013]^.MP4
beispielsweise dieser:
Kottbuller-heissen-Fleisch-baellchen-31.03.2013.MP4
oder jener:
Kottbuller_heissen_Fleisch-baellchen_2013-03-31.mp4
oder der hier:
KottbullerHeissenFleischBaellchen-2013.03.31.mp4
Das Script hat einen Testmodus, in welchem man die Voreinstellungen ausprobieren kann (ohne das der Dateiname tatsächlich verändert wird).
#! /bin/bash
# Aktion/Script fuer FiLe-Manager
# Script von Werner
# https://forum.archlinux.de/viewtopic.php?pid=345248#p345248
# Verwendet coreutils, sed, libnotify
# Letzte Änderung: Mo 18. Apr 11:03:53 CEST 2016
#
# Das Script wird uber das Kontextmenü des Dateimanagers zur Bereinigung
# einzelner Ordner- oder Dateinamen aufgerufen.
# Unter "Optionen" können die Funktionen angepasst oder via
# Kommentarzeichen deaktiviert bzw. aktiviert werden.
#
# Im "Testmodus" können die Optionen als Simulation getestet werden,
# ohne das Datei- und Ordnernamen tatsächlich verändert werden.
# =========================================================================
# Optionen
# =========================================================================
# __________________________ Grundeinstellungen ___________________________
# Testmodus: Änderung von Dateinamen nicht ausführen,
# sondern nur als Notify-Hinweis ausgeben =1
TESTMODE=1
# Notify-Hinweis immer (nicht nur im Testmodus) einblenden =1
NOTE=1
# Dauer Notify-Hinweis in Sekunden (dauerhaft =0)
TIME=8
# Änderungen von Datei- und Verzeichnisnamen in Logdatei dokumentieren =1
# (Die Logdatei wird als "FileRename.log" im Homeverzeichnis abgelegt)
LOGFILE=1
# ______________ Einstellungen für Ordner- und Dateinamen _________________
# Sollen Leerzeichen durch Minuszeichen oder Unterstriche ersetzt werden?
HYPHEN=1 # -> file-name
# UNDERSCORE=1 # -> file_name
# Keine Trennzeichen, sondern Großbuchstaben verwenden =1
# CAMELCASE=1 # -> FileName
# Bereits vorhandene Trennzeichen (-) bzw. (_) durch das
# bevorzugte Trennzeichen ersetzen =1
# MODIFY=1
# Unterstriche zwischen Ziffern durch Minus ersetzen =1
NUM_NO_UNDERSCORE=1
# Punkte zwischen Ziffern durch Minus ersetzen =1
# NUM_NO_DOT=1
# Doppelpunkte zwischen Ziffern durch Minus ersetzen =1
# NUM_NO_COLON=1
# Nur Kleinbuchstaben in Ordner- und Dateinamen verwenden =1
# LOWERCASE=1
# Dateierweiterungen immer in Kleinbuchstaben =1
# (Bei Erweiterungen von bis zu 5 Zeichen)
LOWER_EXT=1
# Erlaubte Sonderzeichen
# (Quotes und Bindestriche werden immer entfernt)
ALLOWED='~:'
# Zeichen, die durch andere Zeichen ersetzt werden
REPLACE='s/º/o/g;s/ª//g'
# Akzentzeichen durch normale Zeichen ersetzen =1
ACCENT=1
# Deutsche Umlaute ersetzen =1
UMLAUT=1
# Datumswerte von DD-MM-YYYY auf YYYY-MM-DD drehen =1
# (Datum wird nur als Zahlenformat, nicht auf Gültigkeit geprüft)
DATE_SPIN=1
# =========================================================================
# Routine
# =========================================================================
IFS=$'\n'
FILE=$( basename ./"$1" )
DIR=$( basename $(pwd) )
PERM=$( if [ -w $(pwd) ]; then echo "1"; else echo "0"; fi )
FD=$( if [ -f "$1" ]; then echo "Datei"; else echo "Verzeichnis"; fi )
ITSME=$( basename $(readlink -f $0) )
LOGNAME=$( echo $HOME"/FileRename.log" )
if [[ $UNDERSCORE = 1 ]]; then SPACE_CHAR='_'; else SPACE_CHAR='-'; fi
if [[ $ACCENT = 1 ]]; then
ACCENT_CHAR='ÀÁÂÃÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕØÙÚÛÝÞàáâãåæçèéêëìíîïðñòóôõøùúûýþÿ'
NORMAL_CHAR='AAAAAACEEEEIIIIDNOOOOOUUUYPaaaaaaceeeeiiiionooooouuuyby'
fi
if [[ $UMLAUT = 1 ]]; then
UMLAUT_CHAR='s/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ß/ss/g'
fi
if [[ "$FILE" = "$DIR" || "$FILE" = "." ]]; then
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Das geht leider nicht…" "<i>Bitte einen Ordner oder eine Datei\nzur Umbenennung auswählen.</i>"
exit
fi
if [[ $PERM = 0 ]]; then
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Das geht leider nicht…" "<i>Keine Berechtigung zur Umbenennung von Dateien und Verzeichnissen.</i>"
exit
fi
if [[ "$FILE" = "lost+found" && -d "$1" ]]; then
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Das geht leider nicht…" "<i>Eine Umbenennung des Verzeichnisses\n\"lost+found\" ist nicht vorgesehen.</i>"
exit
fi
if [ -n "$FILE" ]; then
# ---------------------- Berechnung Dateiname Start ----------------------
if [[ $CAMELCASE = 1 ]]; then
# Erster Buchstabe jeder Buchstabenreihe groß, Trennzeichen zwischen Ziffern
# erhalten und sinnvoll platzieren, Trennzeichen zwischen Wörtern entfernen
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e 's/\(\<.\)/\U\1/g;s/\(_.\)/\U\1/g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*//g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/\ /g' \
-e 's/\([0-9+]\)[\ _-]\([0-9+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]\([A-Za-z+]\)/\1―\2/g' \
-e 's/\([A-Za-z+]\)[\ _-]\([0-9+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]\([A-Za-z+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]/\1―/g;s/[\ _-]\([0-9+]\)/―\1/g' \
-e 's/\([A-Za-z+]\):\([A-Za-z+]\)/\1\2/g' \
-e 's/\.[-~]/\./g;s/[-~]\./\./g' \
-e 's/:[-~]/:/g;s/[-~]:/:/g;s/-~-/~/g' \
-e 's/[\ _-]*//g;s/―/-/g' \
-e 's/\.[-~:]/\./g;s/[-~:]\./\./g' \
-e 's/:[-~]/:/g;s/[-~]:/:/g;s/-~-/~/g' \
-e 's/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-\ ]*//g;s/[-\ ]*$//g' )
# Entfernt Punkte zwischen Buchstaben, nicht aber
# den Punkt vor einer vermeintlichen Dateierweiterung
BASE=$( echo "$BASE" | sed -r 's/(.*)\.(.*)/\1―\2/' \
| sed -e 's/\([A-Za-z+]\)\.\([A-Za-z+]\)/\1\2/g;s/―/\./g' )
elif [[ $UNDERSCORE = 1 || $HYPHEN = 1 ]]; then
# Entfernt und ersetzt Sonderzeichen und Leerzeichen, beseitigt
# Lückenbüßer, ersetzt Akzente und Umlaute
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*//g' \
-e 's/\ /'$SPACE_CHAR'/g;s/'$SPACE_CHAR'\+/'$SPACE_CHAR'/g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/'$SPACE_CHAR'/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 's/-_/'$SPACE_CHAR'/g;s/_-/'$SPACE_CHAR'/g' \
-e 's/[-_~:]\./\./g;s/\.[-_~:]/\./g' \
-e 's/[-_]~/~/g;s/~[-_]/~/g;s/[-_~]:/:/g;s/:[-_~]/:/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 's/\.[-_~]/\./g;s/[-_~]\./\./g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-_\ ]*//g;s/[-_\ ]*$//g' )
else
# Falls weder HYPHEN, UNDERSCORE noch CAMELCASE gewählt worden ist, werden
# nach der Entfernung der Sonderzeichen nur Verkettungen von Trennzeichen bereinigt
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*/\ /g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/\ /g' \
-e 's/\ *\([-_~\:\.]\)\ */\1/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g;s/\ \+/\ /g' \
-e 's/[-_~:]\./\./g;s/\.[-_~:]/\./g;s/[-_]/-/g;s/\.[-_]/-/g' \
-e 's/[-_]~/~/g;s/~[-_]/~/g;s/[-_~]:/:/g;s/:[-_~]/:/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/:\+/:/g;s/\.\+/\./g;s/\ \+/\ /g' \
-e 's/\.[-_~]/\./g;s/[-_~]\./\./g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-_\ ]*//g;s/[-_\ ]*$//g' )
fi
# Optional: Datei- Ordnername in Kleinbuchstaben
if [[ $LOWERCASE = 1 && $CAMELCASE != 1 ]]; then
BASE=$( echo "$BASE" | sed 's/.*/\L&/g' )
fi
# Optional: Dateierweiterung in Kleinbuchstaben (bis zu 5 Zeichen)
if [[ $LOWER_EXT = 1 && -f $FILE ]] && [[ $LOWERCASE != 1 || -z $LOWERCASE ]]; then
EXT_UC=${BASE##*.}
BASE_L=$(expr length "$BASE")
EXT_L=$(expr length "$EXT_UC")
if [[ $EXT_L -le 5 && $BASE_L -gt $EXT_L ]]; then
EXT_LC=$( echo "$EXT_UC" | sed 's/.*/\L&/g' )
BASE=$( echo "$BASE" | sed 's/['$EXT_UC']*$/'$EXT_LC'/' )
fi
fi
# Optional: Datum zu ISO 8601
# Weil \b mit Underscore nicht greift, wird temporär durch U+2013 ersetzt
# Wenn DD MM YYYY mit gleichen Trennzeichen, wird auf YYYY MM DD gedreht
if [[ $DATE_SPIN = 1 ]]; then
BASE=$( echo "$BASE" | sed -r \
-e 's/_/–/g' \
-e 's/\b([0-9]{2})[\.]([0-9]{2})[\.]([0-9]{4})\b/\3\.\2\.\1/g' \
-e 's/\b([0-9]{2})[-]([0-9]{2})[-]([0-9]{4})\b/\3-\2-\1/g' \
-e 's/\b([0-9]{2})[_]([0-9]{2})[_]([0-9]{4})\b/\3-\2-\1/g' \
-e 's/–/_/g' )
fi
# Optional: Modifikation bestehender Trennzeichen
if [[ $MODIFY = 1 ]]; then
BASE=$( echo "$BASE" | sed 's/[[_-]]*/'$SPACE_CHAR'/g' )
fi
# Optional: Trennzeichen zwischen Ziffern anpassen
if [[ $NUM_NO_UNDERSCORE = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[_]\([-0-9]\)/\1\-\2/g' )
fi
if [[ $NUM_NO_DOT = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[\.]\([-0-9]\)/\1\-\2/g' )
fi
if [[ $NUM_NO_COLON = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[:]\([-0-9]\)/\1\-\2/g' )
fi
# Alternativname, falls BASE nach Bereinigung leer sein sollte
if [ -z "$BASE" ]; then
T=$( date +"%Y%m%d-%H%M%S" )
BASE="$USER"""$SPACE_CHAR"""invalid""$SPACE_CHAR""file""$SPACE_CHAR""name-$T"
fi
# ---------------------- Berechnung Dateiname Ende -----------------------
# Zeigt den berechneten Dateinamen als Notify-Hinweis an
if [[ $TESTMODE = 1 || $NOTE = 1 ]]; then
if [ "$BASE" = "$FILE" ]; then
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Der "$FD"name wird nicht geändert:" "<i>$FILE</i>"
else
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Berechneter "$FD"name" "<i>$BASE</i>"
fi
fi
# Aendert den Dateinamen (wenn das Script nicht im Testmodus laeuft)
if [[ -z $TESTMODE || $TESTMODE != 1 ]]; then
if [[ $LOGFILE = 1 ]]; then
TMPFILE=$( mktemp )
mv -v -b -S.bak ./"$FILE" "$BASE" >> "$TMPFILE"
else
mv -v -b -S.bak ./"$FILE" "$BASE"
fi
fi
fi
# Optional: Logdatei wird erstellt bzw. ergänzt
if [[ $LOGFILE = 1 ]] && [[ -z $TESTMODE || $TESTMODE != 1 ]] && [ "$FILE" != "$BASE" ]; then
TS=$( date )
D=$( pwd )
echo "" >> "$LOGNAME"
echo "Script \"$ITSME\"" >> "$LOGNAME"
echo "Verzeichnis: $D" >> "$LOGNAME"
echo "Änderung des "$FD"namen" >> "$LOGNAME"
echo "$TS" >> "$LOGNAME"
echo "" >> "$LOGNAME"
echo "–––––––" >> "$LOGNAME"
# Anpassung Layout der Verbose-Ausgabe von mv
TMPFILE=$( cat "$TMPFILE" \
| sed -e 's/'\''\.\///g;s/'\''$/\n–––––––/g;s/'\''\ ->\ '\''/\n/g' \
-e 's/'\''\ '\('/\ '\('/g;s/\:\ '\''/\:\ /g;s/'\'''\)'/''\)\n–––––––/g' \
-e 's/\".\///g;s/\"\ ->\ '\''/\n/g' )
echo "$TMPFILE" >> "$LOGNAME"
rm -f "$TMPFILE"
fi
# =========================================================================
# Updates
# =========================================================================
# Mo 18. Apr 11:03:53 CEST 2016
# Für Nemo & Nautilus: Basename mit Minuszeichen am Anfang wird nun korrekt interpretiert.
# Für Nemo: Beinhaltendes Verzeichnis wird abgefangen.
2) Ein ergänzendes Script für‘s Kontextmenü des Dateimanagers zu Bereinigung aller Dateinamen innerhalb eines geöffneten Verzeichnisses.
Im Testmodus können die Voreinstellungen zunächst ausprobiert werden:
Beim Start des Scriptes wird in einem Dialogfenster erfragt, ob das Script als Testlauf erfolgen soll. In diesem Testmodus werden keine Änderungen an Dateinamen durchgeführt, die Änderungen werden lediglich in eine Logdatei (
~/FileRename.log) geschrieben.
#!/bin/sh
# Aktion/Script fuer FiLe Manager zur Bereinigung von Ordner- und Dateinamen
# im aufgerufenen Verzeichnis.
# Script von Werner
# Verwendet coreutils, sed, zenity, libnotify
# Letzte Aenderung: So 17. Apr 14:14:57 CEST 2016
#
# Das Script wird uber das Kontextmenue des Dateimanagers aufgerufen.
# Unter "Optionen" koennen die Funktionen angepasst oder durch
# Kommentarzeichen deaktiviert werden.
#
# Ist "TESTMODE=1" aktiv, werden keine Aenderungen von Datei- und
# Verzeichnisnamen durchgefuehrt, sondern die potentiellen Aenderungen
# werden in eine Logdatei im Homeverzeichnis geschrieben.
#
# =========================================================================
# Optionen
# =========================================================================
# __________________________ Grundeinstellungen ___________________________
# Das Script ausschliesslich im Testmodus ausfuehren =1
# TESTMODE=1
# Testmodus beim Start des Scriptes immer anbieten =1
TEST_REQUEST=1
# Notify-Info nach Abschluss des Scripts einblenden =1
NOTE=1
# Dauer Notify-Einblendung in Sekunden (dauerhaft =0)
TIME=7
# ______________ Einstellungen fuer Ordner- und Dateinamen ________________
# Sollen Leerzeichen durch Minuszeichen oder Unterstriche ersetzt werden?
HYPHEN=1 # -> file-name
# UNDERSCORE=1 # -> file_name
# Keine Trennzeichen, sondern Großbuchstaben verwenden =1
# CAMELCASE=1 # -> FileName
# Bereits vorhandene Trennzeichen (-) bzw. (_) durch das
# bevorzugte Trennzeichen ersetzen =1
# MODIFY=1
# Unterstriche zwischen Ziffern durch Minus ersetzen =1
NUM_NO_UNDERSCORE=1
# Punkte zwischen Ziffern durch Minus ersetzen =1
# NUM_NO_DOT=1
# Doppelpunkte zwischen Ziffern durch Minus ersetzen =1
# NUM_NO_COLON=1
# Nur Kleinbuchstaben in Ordner- und Dateinamen verwenden =1
# LOWERCASE=1
# Dateierweiterungen immer in Kleinbuchstaben =1
# (Bei Erweiterungen von bis zu 5 Zeichen)
LOWER_EXT=1
# Erlaubte Sonderzeichen
# (Quotes und Bindestriche werden immer entfernt)
ALLOWED='~:'
# Zeichen, die durch andere Zeichen ersetzt werden
REPLACE='s/º/o/g;s/ª//g'
# Akzentzeichen durch normale Zeichen ersetzen =1
ACCENT=1
# Deutsche Umlaute ersetzen =1
UMLAUT=1
# Datumswerte von DD-MM-YYYY auf YYYY-MM-DD drehen =1
# (Datum wird nur als Zahlenformat, nicht auf Gültigkeit geprüft)
DATE_SPIN=1
# =========================================================================
# Routine
# =========================================================================
IFS=$'\n'
FILE=$( basename "$1" )
DIR=$( basename $(pwd) )
PERM=$( if [ -w $(pwd) ]; then echo "1"; else echo "0"; fi )
HIDDEN=$( find $(pwd) -maxdepth 0 -path '*/\.*' | wc -l )
ITSME=$( basename $(readlink -f $0) )
LOGNAME=$( echo $HOME"/FileRename.log" )
TMPFILE=$( mktemp )
JOB=$( ls $(pwd) --ignore="lost+found" | wc -l )
if [[ $UNDERSCORE = 1 ]]; then SPACE_CHAR='_'; else SPACE_CHAR='-'; fi
if [[ $ACCENT = 1 ]]; then
ACCENT_CHAR='ÀÁÂÃÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕØÙÚÛÝÞàáâãåæçèéêëìíîïðñòóôõøùúûýþÿ'
NORMAL_CHAR='AAAAAACEEEEIIIIDNOOOOOUUUYPaaaaaaceeeeiiiionooooouuuyby'
fi
if [[ $UMLAUT = 1 ]]; then
UMLAUT_CHAR='s/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ß/ss/g'
fi
if [ $( whoami ) = "root" ]; then
zenity --error --title="$ITSME" --text \
"Das Script darf nicht mit Root-Rechten ausgeführt werden! "
exit
fi
if [[ $PERM = 0 ]]; then
zenity --error --title="$ITSME" --text \
"Die Benutzerrechte des Verzeichnisses \"$FILE\" lassen \neine Umbenennung von Datei- und Verzeichnisnamen nicht zu. "
exit
fi
if [[ $JOB -lt 1 ]]; then
zenity --info --title="$ITSME" --text \
"Im Verzeichnis \"$DIR\" gibt es \nkeine änderbaren Datei- und Verzeichnisnamen. "
exit
fi
if [[ $TEST_REQUEST = 1 ]] && [[ $TESTMODE != 1 || -z $TESTMODE ]]; then TESTMODE=1
if ! zenity --question --title="$ITSME" --text \
"Soll ein Testdurchlauf erfolgen? \n\nDateinamen werden nicht geändert, sondern in \neine Logdatei geschrieben: \n\n $LOGNAME"
then TESTMODE=0
fi
fi
if [[ $TESTMODE != 1 || -z $TESTMODE ]]; then
if [[ $HIDDEN = 1 ]]; then
if ! zenity --question --title="$ITSME" --window-icon="warning" --text \
"Das Script wird innerhalb eines verborgenen \nVerzeichnisses ausgeführt!\n\n
Sollen die Namen aller $JOB Dateien und Ordner im Verzeichnis \"$DIR\" dennoch geprüft und bereinigt werden? "
then exit
fi
else
if ! zenity --question --title="$ITSME" --text \
"Sollen die Namen aller $JOB Dateien und Ordner im \nVerzeichnis \"$DIR\" geprüft und bereinigt werden? "
then exit
fi
fi
fi
for FILE in *; do
# ---------------------- Berechnung Dateiname Start ----------------------
if [[ $CAMELCASE = 1 ]]; then
# Erster Buchstabe jeder Buchstabenreihe groß, Trennzeichen zwischen Ziffern
# erhalten und sinnvoll platzieren, Trennzeichen zwischen Wörtern entfernen
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e 's/\(\<.\)/\U\1/g;s/\(_.\)/\U\1/g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*//g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/\ /g' \
-e 's/\([0-9+]\)[\ _-]\([0-9+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]\([A-Za-z+]\)/\1―\2/g' \
-e 's/\([A-Za-z+]\)[\ _-]\([0-9+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]\([A-Za-z+]\)/\1―\2/g' \
-e 's/\([0-9+]\)[\ _-]/\1―/g;s/[\ _-]\([0-9+]\)/―\1/g' \
-e 's/\([A-Za-z+]\):\([A-Za-z+]\)/\1\2/g' \
-e 's/\.[-~]/\./g;s/[-~]\./\./g' \
-e 's/:[-~]/:/g;s/[-~]:/:/g;s/-~-/~/g' \
-e 's/[\ _-]*//g;s/―/-/g' \
-e 's/\.[-~:]/\./g;s/[-~:]\./\./g' \
-e 's/:[-~]/:/g;s/[-~]:/:/g;s/-~-/~/g' \
-e 's/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-\ ]*//g;s/[-\ ]*$//g' )
# Entfernt Punkte zwischen Buchstaben, nicht aber
# den Punkt vor einer vermeintlichen Dateierweiterung
BASE=$( echo "$BASE" | sed -r 's/(.*)\.(.*)/\1―\2/' \
| sed -e 's/\([A-Za-z+]\)\.\([A-Za-z+]\)/\1\2/g;s/―/\./g' )
elif [[ $UNDERSCORE = 1 || $HYPHEN = 1 ]]; then
# Entfernt und ersetzt Sonderzeichen und Leerzeichen, beseitigt
# Lückenbüßer, ersetzt Akzente und Umlaute
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*//g' \
-e 's/\ /'$SPACE_CHAR'/g;s/'$SPACE_CHAR'\+/'$SPACE_CHAR'/g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/'$SPACE_CHAR'/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 's/-_/'$SPACE_CHAR'/g;s/_-/'$SPACE_CHAR'/g' \
-e 's/[-_~:]\./\./g;s/\.[-_~:]/\./g' \
-e 's/[-_]~/~/g;s/~[-_]/~/g;s/[-_~]:/:/g;s/:[-_~]/:/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g' \
-e 's/\.[-_~]/\./g;s/[-_~]\./\./g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-_\ ]*//g;s/[-_\ ]*$//g' )
else
# Falls weder HYPHEN, UNDERSCORE noch CAMELCASE gewählt worden ist, werden
# nach der Entfernung der Sonderzeichen nur Verkettungen von Trennzeichen bereinigt
BASE=$( echo "$FILE" \
| sed -e 's/[[‐‑‒–—―]]*/-/g;s/\t/\ /g' \
-e ''$REPLACE';s/[['\''’"„“‚‘»«›‹]]*/\ /g' \
-e 's/[^A-Za-z0-9'$ALLOWED'\._-]/\ /g' \
-e 's/\ *\([-_~\:\.]\)\ */\1/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/\.\+/\./g;s/:\+/:/g;s/\ \+/\ /g' \
-e 's/[-_~:]\./\./g;s/\.[-_~:]/\./g;s/[-_]/-/g;s/\.[-_]/-/g' \
-e 's/[-_]~/~/g;s/~[-_]/~/g;s/[-_~]:/:/g;s/:[-_~]/:/g' \
-e 's/_\+/_/g;s/-\+/-/g;s/~\+/~/g;s/:\+/:/g;s/\.\+/\./g;s/\ \+/\ /g' \
-e 's/\.[-_~]/\./g;s/[-_~]\./\./g' \
-e 'y/'$ACCENT_CHAR'/'$NORMAL_CHAR'/' \
-e ''$UMLAUT_CHAR'' \
-e 's/^[-_\ ]*//g;s/[-_\ ]*$//g' )
fi
# Optional: Datei- Ordnername in Kleinbuchstaben
if [[ $LOWERCASE = 1 && $CAMELCASE != 1 ]]; then
BASE=$( echo "$BASE" | sed 's/.*/\L&/g' )
fi
# Optional: Dateierweiterung in Kleinbuchstaben
if [[ $LOWER_EXT = 1 && -f $FILE ]] && [[ $LOWERCASE != 1 || -z $LOWERCASE ]]; then
EXT_UC=${BASE##*.}
BASE_L=$(expr length "$BASE")
EXT_L=$(expr length "$EXT_UC")
if [[ $EXT_L -le 5 && $BASE_L -gt $EXT_L ]]; then
EXT_LC=$( echo "$EXT_UC" | sed 's/.*/\L&/g' )
BASE=$( echo "$BASE" | sed 's/['$EXT_UC']*$/'$EXT_LC'/' )
fi
fi
# Optional: Datum zu ISO 8601
# Weil \b mit Underscore nicht greift, wird temporär durch U+2013 ersetzt
# Wenn DD MM YYYY mit gleichen Trennzeichen, wird auf YYYY MM DD gedreht
if [[ $DATE_SPIN = 1 ]]; then
BASE=$( echo "$BASE" | sed -r \
-e 's/_/–/g' \
-e 's/\b([0-9]{2})[\.]([0-9]{2})[\.]([0-9]{4})\b/\3\.\2\.\1/g' \
-e 's/\b([0-9]{2})[-]([0-9]{2})[-]([0-9]{4})\b/\3-\2-\1/g' \
-e 's/\b([0-9]{2})[_]([0-9]{2})[_]([0-9]{4})\b/\3-\2-\1/g' \
-e 's/–/_/g' )
fi
# Optional: Modifikation bestehender Trennzeichen
if [[ $MODIFY = 1 ]]; then
BASE=$( echo "$BASE" | sed 's/[[_-]]*/'$SPACE_CHAR'/g' )
fi
# Optional: Trennzeichen zwischen Ziffern anpassen
if [[ $NUM_NO_UNDERSCORE = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[_]\([-0-9]\)/\1\-\2/g' )
fi
if [[ $NUM_NO_DOT = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[\.]\([-0-9]\)/\1\-\2/g' )
fi
if [[ $NUM_NO_COLON = 1 ]]; then
BASE=$( echo "$BASE" | sed \
-e 's/\([0-9]\)[:]\([-0-9]\)/\1\-\2/g' )
fi
# Alternativname, falls BASE nach Bereinigung leer sein sollte
if [ -z "$BASE" ]; then
T=$( date +"%Y%m%d-%H%M%S" )
BASE="$USER"""$SPACE_CHAR"""invalid""$SPACE_CHAR""file""$SPACE_CHAR""name-$T"
fi
# ---------------------- Berechnung Dateiname Ende -----------------------
# Temporäres Logfile für Testdurchlauf
if [[ $TESTMODE = 1 && "$FILE" != "lost+found" ]]; then
Z=$(( $Z+1 ))
if [ "$FILE" != "$BASE" ]; then
I=$(( $I+1 ))
echo "$FILE" >> "$TMPFILE"
echo "$BASE" >> "$TMPFILE"
echo "–––––––" >> "$TMPFILE"
fi
# Temporäres Logfile für Umbenennung
elif [[ $TESTMODE != 1 || -z $TESTMODE ]] && [ "$FILE" != "lost+found" ]; then
Z=$(( $Z+1 ))
if [ "$FILE" != "$BASE" ]; then
I=$(( $I+1 ))
mv -v -b -S.bak ./"$FILE" "$BASE" >> "$TMPFILE"
fi
fi
done
# Logdatei wird erstellt bzw. ergänzt
if [[ $TESTMODE = 1 ]]; then
TS=$( date )
D=$( pwd )
echo "" >> "$LOGNAME"
echo "Script \"$ITSME\"" >> "$LOGNAME"
echo "Verzeichnis: $D" >> "$LOGNAME"
echo "Testdurchlauf" >> "$LOGNAME"
echo "Start: $TS" >> "$LOGNAME"
echo "" >> "$LOGNAME"
echo "–––––––" >> "$LOGNAME"
cat "$TMPFILE" >> "$LOGNAME"
if [[ $Z = $JOB ]] && [ -z $I ]; then
echo "Es wurden keine zu ändernden Datei- und Verzeichnisnamen gefunden" >> "$LOGNAME"
echo "–––––––" >> "$LOGNAME"
fi
rm -f "$TMPFILE"
else
TS=$( date )
D=$( pwd )
echo "" >> "$LOGNAME"
echo "Script \"$ITSME\"" >> "$LOGNAME"
echo "Verzeichnis: $D" >> "$LOGNAME"
echo "Änderung von Datei- und Ordnernamen" >> "$LOGNAME"
echo "Start: $TS" >> "$LOGNAME"
echo "" >> "$LOGNAME"
echo "–––––––" >> "$LOGNAME"
if [[ $Z = $JOB ]] && [ -z $I ]; then
echo "Es wurden keine zu ändernden Datei- und Verzeichnisnamen gefunden" >> "$LOGNAME"
echo "–––––––" >> "$LOGNAME"
fi
# Anpassung Layout der Verbose-Ausgabe von mv
TMPFILE=$( cat "$TMPFILE" \
| sed -e 's/'\''\.\///g;s/'\''$/\n–––––––/g;s/'\''\ ->\ '\''/\n/g' \
-e 's/'\''\ '\('/\ '\('/g;s/\:\ '\''/\:\ /g;s/'\'''\)'/''\)\n–––––––/g' \
-e 's/\".\///g;s/\"\ ->\ '\''/\n/g' )
echo "$TMPFILE" >> "$LOGNAME"
rm -f "$TMPFILE"
fi
# Optional: Notify-Info
if [[ $NOTE = 1 ]]; then
if [[ $TESTMODE = 1 ]]; then
KIND='Testdurchlauf – '
fi
if [ -z $I ]; then
I='Keine'
elif [[ $I -gt 1 ]]; then
PL='en'
fi
/usr/bin/notify-send -t "$TIME""000" --icon=info \
"Ordner- und Dateinamen bereinigen"\
"<i>$KIND$I Änderung$PL – Logdatei:\n$LOGNAME</i>"
fi
Edit 12.02.2017: Script Nr. 2 zur Änderung aller Dateinamen in einem Verzeichnis hinzugefügt.