#76 02.10.2015 20:55:49

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

TBone schrieb:

if [ ! -e /bin/photorec -o ! -e /sbin/photorec ]; then


"which photorec" zeigt dir, wo das Binary liegt. Wenn /bin, /sbin endlich gelöscht werden, musst du das Skript dann nicht nochmal ändern ;-)

Stimmt, dann so:

$HOME/bin/usb-sniffer
-----------------------
#!/bin/bash

usbdrive=/dev/sdb
homedir=$HOME

## check if 'testdrive' is installed
if ! which photorec > /dev/null 2>&1; then
    echo "Please install the package \'testdrive\'."
    exit
fi

## if a thumb drive is plugged, start photorec
while true; do
    if [ -e $usbdrive ]; then

        ## do nothing if photorec is already running
	if pgrep photorec > /dev/null; then
	    sleep 0.2

        ## start photorec if it isn't running yet
        else
	    recdir=$homedir/.usb-sniffer/rec_$(date +%Y%m%d-%H%M%S)
            mkdir -p $recdir; cd $recdir
	    photorec /d ./ /cmd $usbdrive wholespace,search &
        fi
    else

        ## kill photorec if it is still running
        pgrep photorec > /dev/null && kill -15 $(pgrep photorec) && echo -e "\nAll the files have been saved to:\n$recdir\n"
        sleep 0.2
    fi
done
---------------------------------------------------------------
$ chmod 4700 usb-sniffer
$ alias usb-sniffer='sudo usb-sniffer'
$ usb-sniffer

#77 27.11.2015 21:48:58

Markus.N
Mitglied

Re: Eure brauchbarsten Funktionen

Das mache ich immer, wenn es ein Update der Mirrorlist gab:

sed -e "/## Germany/,/^$/ { s/#Server/Server/ }" /etc/pacman.d/mirrorlist.pacnew > /etc/pacman.d/mirrorlist

Das macht zwischen "## Germany" und der nächsten Leerzeile alle Kommentare weg, d.h. stellt diese Server auf aktiv.

Ich hätte auch noch eine weitere Variante zu bieten, die alles außer dem oben beschriebenen Bereich ganz wegwirft:

sed -n -e "/## Germany/,/^$/ { s/#Server/Server/; p }" /etc/pacman.d/mirrorlist.pacnew > /etc/pacman.d/mirrorlist

Wer die Überschrift und den "deutsche Server" Block haben will, kann auch das da machen:

sed -n -e "1,/^$/ p; /## Germany/,/^$/ { s/#Server/Server/; p }" /etc/pacman.d/mirrorlist.pacnew > /etc/pacman.d/mirrorlist

Zum Ausprobieren wie das Ergebnis aussieht, einfach den letzten Teil ab dem ">" weglassen.

Gruß,
Markus

Offline

#78 28.11.2015 05:42:01

Gering ding ding ding din
Gast

Re: Eure brauchbarsten Funktionen

Hoppla, da kann aber jemand mit dem Stream Editor umgehen! smile

#79 28.11.2015 11:06:00

Dirk
Moderator

Re: Eure brauchbarsten Funktionen

Markus.N schrieb:

Das mache ich immer, wenn es ein Update der Mirrorlist gab:

rm /etc/pacman.d/mirrorlist.pacnew

Ich weiß, welchen Mirror ich benutze, und warum, und habe kein Interesse daran, dies zu ändern.

Offline

#80 28.11.2015 11:23:46

sanni
Mitglied

Re: Eure brauchbarsten Funktionen

+1 smile

Offline

#81 29.11.2015 02:21:40

LessWire
Mitglied

Re: Eure brauchbarsten Funktionen

Dirk schrieb:

Ich weiß, welchen Mirror ich benutze, und warum, und habe kein Interesse daran, dies zu ändern.

Ich auch nicht - aber was lange währt, hält nicht unbedingt ewig... sad

Offline

#82 05.03.2016 23:54:24

Werner
Mitglied

Re: Eure brauchbarsten Funktionen

Ein Script für Crontab, um beizeiten einen automatischen Hinweis zu erhalten, wenn der Notebook-Akku zur Neige geht.

Sollten zwei Akkus vorhanden sein (bei meinem Thinkpad ist es ein zusätzlicher Slice-Akku), wird die Meldung getriggert, sobald der erste Akku die Entladungsschwelle erreicht hat. Nach Abschaltung des Zweitakkus wird die Meldung erst dann wieder getriggert, wenn der andere Akku die Entladungsschwelle erreicht.
(Verwendet acpi und libnotify)

#!/bin/bash

# Gibt einen Hinweis aus, sobald der Ladezustand des Notebook-Akkus [BAT0]
# oder – falls zwei Akkus vorhanden – [BAT0] oder [BAT1] eine bestimmte
# Entladungsschwelle erreicht hat.
# Einbindung des Scriptes mit crontab z. B. alle 5 Minuten "*/5  *  *  *   *"

# ============== Voreinstellungen ==============

# Session z. B. "xfce4-session" oder "gnome-session":
DE="xfce4-session"

# Ab welcher Entladungsschwelle in Prozent ein Hinweis erfolgt:
LOW=15

# Sprachhinweis (espeak) anstelle von notify-send =1:
VOICE=0

# =================== Script ===================

# Nur dann, wenn kein Netzteil angeschlossen ist:
if [ $(cat $(find /sys/class/power_supply/*/online)) == "0" ]; then

	# Fuer Warnhinweis durch notify-send mit crontab:
	eval "export $(grep -P -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME $DE)/environ)"

	# Ladestatus Batterie 
	BATTTERY_0=$(acpi -b | grep -P -o '[0-9]+(?=%)' | head -n1)
	BATTTERY_1=$(acpi -b | grep -P -o '[0-9]+(?=%)' | tail -n1)

	# Welche Batteriedaten im Hinweis angezeigt werden:
	STATUS=$(acpi -b | cut -d" " -f1,2,4 | sed 's/,//g')

	# Hinweis bei Erreichen der Entladungsschwelle:
	if [ $BATTTERY_0 -le $LOW ] || [ $BATTTERY_1 -le $LOW ]; then
		if [ -z $VOICE ] || [ $VOICE != 1 ]; then
			/usr/bin/notify-send -u critical --icon=dialog-warning "Erinnerung Batterie:" "${STATUS}"
		else
			espeak -v de -a100 -p40 -s180 -g10 -k10 "$STATUS"
		fi
	fi
fi

Edit: Umformuliert, die Prüfung des Netzteilanschlusses erfolgt nun optimalerweise zu Beginn des Scripts, Option für Sprachnachricht (espeak) hinzugefügt.

Beitrag geändert von Werner (10.03.2016 21:04:37)

Offline

#83 08.03.2016 23:05:10

michi
Mitglied

Re: Eure brauchbarsten Funktionen

In der ~/.bashrc ganz praktisch zum clonen von AUR git-repos...

aur-clone() {
  local package=$1
  if [ -z $package ]; then
    echo "no package specified"
  else  
    git clone ssh://aur@aur.archlinux.org/$package.git
  fi
}

Offline

#84 17.04.2016 16:01:20

Werner
Mitglied

Re: Eure brauchbarsten Funktionen

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://bbs.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.

Beitrag geändert von Werner (12.02.2017 14:31:41)

Offline

#85 19.06.2016 09:38:17

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

Quick-and-dirty Frontend Funktion für
arch-wiki-lite
bei gesetzter $wiki_width Variable:

$ type ws
ws ist eine Funktion.
ws () 
{ 
    wiki-search $*;
    if [[ $1 =~ [a-zA-Z] ]]; then
        echo -e "\033[0;34mChoose a number:\033[0m \c";
        read CHOICE;
        wiki-search $CHOICE;
        unset CHOICE;
    fi

#86 19.06.2016 09:40:09

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

}

Da war doch noch was big_smile ^^

#87 10.07.2016 10:18:51

efreak4u
Mitglied

Re: Eure brauchbarsten Funktionen

... wegen staendig auftretender Fehlermeldung beim Abmelden/schliessen des Terminals

alias :q='exit'

Um Bilder zu scannen...

### Scan Image
function scanimg()
  {
   if [[ "$1" ]]; then
	case "$1" in
                *.png)      scanimage -x 210 -y 297 --format=png > "$1"   ;;
                *.jpg)      scanimage -x 210 -y 297 --format=jpg > "$1"   ;;
                *.tiff)     scanimage -x 210 -y 297 --format=tiff > "$1"  ;;
                *)          echo "'"$1"' Error. Please go away" ;;
	esac
   else
	echo "Usage: scanimg FILE.png | FILE.jpg | FILE.tiff"
   fi
  }

... und um Netzlaufwerke einzubinden (inkl. Start des NAS)

function wnas()
  {
   if [ "$(ls -A /mnt/sshfs/daten)" ]; then
	echo "...bereits eingebunden"
   else
        PING=$(ping -c 1 -W 3 XXX.XXX.XXX.XXX && echo 1)
        if [ "$PING" = "1" ]; then
                mount /mnt/sshfs/daten &&
                mount /mnt/sshfs/musik &&
		echo "... erledigt"
        else
                wol XX:XX:XX:XX:XX:XX &&
                echo "warte 10 Sekunden auf Festplattenstart" &&
                sleep 10 &&
                mount /mnt/sshfs/daten &&
                mount /mnt/sshfs/musik &&
		echo "... erledigt"
        fi
   fi
  }

Beitrag geändert von efreak4u (10.07.2016 10:26:00)

Offline

#88 29.09.2016 13:52:52

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

Steht die Internetverbindung schon?

hello () 
{ 
    RHOST="archlinux.org"
    [[ -n $1 ]] && RHOST="$1"
    declare -i N=2;
    until [[ $N -eq 0 ]]; do
        echo -e ".\c";
        STDOUT=$(ping -c1 $RHOST 2> /dev/null);
        N=$?;
        [[ N -eq 0 ]] || sleep 1s;
    done;
    echo -e "\b$STDOUT"
}

liefert:

$ hello
.......................PING archlinux.org (66.211.214.131) 56(84) bytes of data.
64 bytes from gudrun.archlinux.org (66.211.214.131): icmp_seq=1 ttl=54 time=123 ms

--- archlinux.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 123.950/123.950/123.950/0.000 ms
$

und mit Argument:

$ hello debian.org
.....PING debian.org (5.153.231.4) 56(84) bytes of data.
64 bytes from senfter.debian.org (5.153.231.4): icmp_seq=1 ttl=51 time=48.5 ms

--- debian.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 48.592/48.592/48.592/0.000 ms
$

#89 29.09.2016 14:53:08

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

OK, vergesst die letzte Funktion von mir - hier nochmal ein Update derselbigen zwecks saubererer Umgang mit Variablen:

hello () 
{ 
    [[ -z "$RHOST" ]] && RHOST="archlinux.org";
    [[ -n $1 ]] && RHOST="$1";
    declare P_OUT;
    declare -i N=2;
    until [[ $N -eq 0 ]]; do
        echo -e ".\c";
        P_OUT=$(ping -c1 $RHOST 2> /dev/null);
        N=$?;
        [[ N -eq 0 ]] || sleep 1s;
    done;
    echo -e "\b$P_OUT"
}

Kurz zur Erklärung:
Die Variable RHOST verbleibt im Scope der ausführenden Shell.
Wenn ich also einmal

$ hello google.de

verwendet habe, merkt sich das die Shell und ich brauche beim nächsten mal nur noch

$ hello

aufzurufen und erhalte das gleiche Ergebnis.
Alle anderen Variablen verbleiben jedoch im Scope der Funktion, so dass es da keine Beeinflussung zwischen Shell und Funktion gibt.

#90 01.10.2016 21:05:42

Werner
Mitglied

Re: Eure brauchbarsten Funktionen

Der CSS-Code modifiziert die Firefox-Searchbar in‘s Listenformat, in etwa so, wie die Suchmaschinenliste früher war.
Funktioniert sowohl mit hellen als auch dunklen GTK3-Themes ab Firefox 45.

~/.mozilla/firefox/PROFILNAME/chrome/userChrome.css

/* ======================= Firefox Searchbar als Liste ======================  */
/* ::::::::::::::: Basis: chrome://browser/skin/searchbar.css :::::::::::::::: */
/*                             Version 2018.04.29                              */

/* Listenformat Suchmaschinen */
.searchbar-engine-one-off-item[tooltiptext] {
	width: 100% !important;
	height: 24px !important;
	background-image: none !important;
	padding-left: 6px !important;
	box-sizing: content-box !important;
	line-height: 1em !important;
	color: inherit !important;
}
/* Leere Felder und animiertes "Mit Soundso suchen" verbergen */
.searchbar-engine-one-off-item:not([tooltiptext]), .search-panel-current-input {
	display: none !important;
}
/* Trennlinien zwischen Listeneinträgen */
.searchbar-engine-one-off-item[tooltiptext], .addengine-item,
.searchbar-engine-one-off-item.last-of-row:not(.dummy) {
	border-bottom: 1px solid #cccccc !important;
	margin-top: -1px !important; /* Korrektur border 2px (top+bottom) */
}
.search-setting-button, .search-setting-button:not(.last-row) {
	border: none !important;
}
/* Namen der Suchmaschinen */
.searchbar-engine-one-off-item[tooltiptext]::after {
	content: attr(tooltiptext);
	display: block !important;
	margin: 5px 6px 0px !important;
}
/* Icons der Suchmaschinen */
.searchbar-engine-one-off-item > .button-box {
	display: inline-flex !important;
	width: 16px !important;
	max-width: 16px !important;
	margin-top: 4px !important;
}
/* Vertikale Mindesthöhe Suchvorschläge 4 Einträge zu 1.5em */
.search-panel-tree > .autocomplete-treebody {
	min-height: 6em !important;
}
/* Anpassung Schriftfarbe an jeweiliges GTK3-Theme */
.search-panel-header {
	border: none !important;
	color: inherit !important;
	background-color: inherit !important;
}
.search-panel-header[selected],
.search-panel-header:hover {
	background-color: Highlight !important;
}
.search-panel-header > label {
	font-style: italic !important;
}
.searchbar-engine-one-off-item[selected], .search-setting-button[selected] {
	color: HighlightText !important;
}
.search-panel-one-offs {
	border-top: 1px solid #cccccc !important;
	background-color: inherit !important;
}

/* ------------------------------- Optional ----------------------------------*/

/* Bei Bedarf vertikale Höhe der Schrift nachjustieren (default 6px): */
.searchbar-engine-one-off-item[tooltiptext]::after {
	margin-top: 6px !important;
}

Update – Voransichten nachgereicht: Default helles und dunkles Theme | Modifiziertes helles und dunkles Theme
Update – Getestet bis Firefox 59
Update – Ich habe die Option zum Ausblenden von 'Suchmaschine hinzufügen' entfernt, weil die entsprechende Funktion ab FF 57 in den Sucheinstellungen entfernt worden ist.
Update – Automatische Anpassung der Schriftfarbe an das Dark Theme ab Firefox 61 (zum Zeitpunkt der Änderung noch Nightly)
Update – Verbesserungen beim Zusammenspiel von Firefox- und GTK3-Themes ab Firefox 59 – 29.04.2018

Beitrag geändert von Werner (29.04.2018 19:32:33)

Offline

#91 06.03.2017 10:13:46

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

Weil mich die ewige Tipperei nervt, wenn ich mal eine gerade öfters relevante Kollektion von Servicen checken will:

#!/bin/bash

declare -a SERVICES=(
	'named.service'
	'pdnsd.service'
	'dnscrypt-proxy.socket'
	'dnscrypt-proxy.service'
	)


declare -a IS_ACTIVE
declare Si

declare -i INC=0
for Si in ${SERVICES[@]}; do
  IS_ACTIVE[$INC]="$(systemctl is-active $Si)"
  INC+=1
done

declare IAi
INC=0
for IAi in ${IS_ACTIVE[@]}; do
  if [[ "$IAi" == "active" ]]; then
    printf "  %-28s %s \033[1;32m%s\033[0m\n" "${SERVICES[$INC]}" ":" "${IS_ACTIVE[$INC]}"
  elif [[ "$IAi" == "inactive" ]]; then
    printf "  %-28s %s \033[0;31m%s\033[0m\n" "${SERVICES[$INC]}" ":" "${IS_ACTIVE[$INC]}"
  else
    printf "  %-28s %s %s\n" "${SERVICES[$INC]}" ":" "${IS_ACTIVE[$INC]}"
  fi
  INC+=1
done

Das schöne ist, dass hier nur der Inhalt des Arrays nach den eigenen aktuellen Bedürfnissen angepasst werden muss.
Und ganz wichtig: die Ausgabe kommt bunt und in Farbe.

#92 12.12.2017 14:53:22

Werner
Mitglied

Re: Eure brauchbarsten Funktionen

Firefox 57+ hat ein dunkles Theme, das man unter "Anpassen…" auswählen kann. Leider aber sind das Seitenpanel, die Startseite und die Neuer-Tab-Seite nicht daran angepasst, was ich ergänzt/geändert habe.

Anpassungen an das dunkle Theme von Firefox 57+

Seitenpanels (Lesezeichen, Chronik):
~/.mozilla/firefox/<Profilname>/chrome/userChrome.css

/* Do not remove the @namespace line – it's required for correct functioning */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
@namespace html url("http://www.w3.org/1999/xhtml"); /* namespace for HTML elements */

/* =============================== Sidebar ============================ */
/* :::::::::::::::::::::::::: Version 2017-12-11 :::::::::::::::::::::: */

#sidebar, #sidebar-header, #bookmarksPanel, #bookmarks-view,
#history-panel, #historyTree, #viewButton {
	background: #2e2e2e !important;
	color: #f7f7f7 !important;
}
#sidebar-header,
.sidebar-header {
	font-size: 1.15em !important;
	font-weight: normal !important;
	}
.sidebar-placesTreechildren::-moz-tree-cell(hover),chrome://browser/content/history/history-panel.xul
.sidebar-placesTreechildren::-moz-tree-row(selected),
.sidebar-placesTreechildren::-moz-tree-cell-text(hover),
.sidebar-placesTreechildren::-moz-tree-cell-text(selected),
#viewButton:hover {
	background: #474749 !important;
	color: #d1d1d1 !important;
	}
#sidebar-splitter {
	opacity: 0.2 !important;
	width: 1px !important;
	border: 0 !important;
	}
treechildren::-moz-tree-image(title, container),
treechildren::-moz-tree-image(title, open) {
	list-style-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QwLFwAK+oFUbAAAAKZJREFUOMvtk7EJw0AMRV+CVbgKXHO7ZIC0LryD5/AQ17twfa0H0AyewgTcGFy4UIoQcCCESy5lPqgRvCeQEOSmaZoTYI/y3lvf9+dkgYhch2EwVTVVtRCCOees67pLCn8ATFWfmuM40rYt0zS9G8y2ba8FKVmWhaqq7oKcHRYAMcav4LquOeZe8S/4gaAQEeZ5pizLj8B1XRERAExEbP9QKbVj8nIDQYtGe9TGy2QAAAAASUVORK5CYII=') !important;
	}
@-moz-document url("chrome://browser/content/bookmarks/bookmarksPanel.xul"), 
url("chrome://browser/content/history/history-panel.xul") {
	#search-box > hbox {
		height: 1.9em !important;
		color: #d1d1d1 !important;
		background: #474747 !important;
	}
	textbox {
		-moz-appearance: none !important;
		cursor: text !important;
		margin: 2px 4px !important;
		padding: 2px 2px 3px !important;
		padding-inline-start: 4px !important;
		background-color: #474747 !important;
		color: #474747 !important;
		border: 1px solid #111111 !important;
	}
	textbox:hover {
		border: 1px solid #4AA6D7 !important;
		box-shadow:0 1px 2px rgba(12, 12, 13, 0.6) !important;
	}
}

Startseite und Neuer Tab:
~/.mozilla/firefox/<Profilname>/chrome/userContent.css

/* ======================= about:newtab about:home ====================== */
/* ::::::::::::::::::::::::: Version 2017-12-13 ::::::::::::::::::::::::: */

@-moz-document url(about:newtab), url(about:home) {
	body {
		background-size: cover !important;
		background-color: #262626 !important;
		overflow: auto !important;
		color: #d1d1d1 !important;
	}
	#newtab-customize-overlay {
		background: #2e2e2e !important;
	}
	.card,
	.prefs-pane .sidebar {
		background: #2e2e2e !important;
		color: #f7f7f7 !important;
	}
	.prefs-pane .actions {
		background: #2e2e2e !important;
		border-left: 1px solid #ededed;
	}
	.prefs-pane-button button {
		border: 1px solid #ededed !important;
	}
	.prefs-pane-button button:hover {
		background-color: none !important;
		fill: rgba(12, 12, 13, 0.6) !important;
}
.prefs-pane .prefs-modal-inner-wrapper .options {
	background: none !important;
	}
	.context-menu, .section-top-bar .info-option {
		background: #444 !important;
		color: #ededed !important;
		font-size: 13px !important;
	}
	#onboarding-notification-bar.onboarding-opened {
		display: none !important; /* Keine Reklame auf der Startseite */
	}
	#snippets-container {
		background: #bababa !important;
		opacity: 1 !important;
	}
	.section-title span {
		color: #d1d1d1 !important;
		fill: #737373 !important;
		vertical-align: middle !important;
	}
	.icon, 
	.icon.icon-topsites, 
	.icon.icon-pocket, 
	.info-option-icon,
	.icon.icon-highlights {
		fill: #d1d1d1 !important;
	}
	.card {
		background: #474747 !important;
	}
	.topic,
	.card-host-name, 
	.card-context, 
	.data-reactid, 
	.empty-state-message, 
	.card-outer, 
	.card-text, 
	.card-title {
		color: #d1d1d1 !important;
	}
	.card-outer .card-text:not(.no-description) .card-title {
	color: inherit !important;
	}
	.modal {
		background: #535353 !important;
	}
	.tile {
		background: #d1d1d1 !important;
	}
	.actions button:not(.done) {
		background: #777777 !important;
		border: 1px solid #B1B1B3;
		border-radius: 4px;
		color: #d1d1d1 !important;
		cursor: pointer;
		white-space: nowrap;
	}
	.section-top-bar .info-option-manage button, 
	.section-top-bar .info-option-manage button::after, 
	.edit-topsites-wrapper .edit-topsites-button button,
	.topic .topic-read-more,
	.topic .topic-read-more::after,
	.data-reactid,
	.info-option-link,
	.topic-link {
		color: #4AA6D7 !important;
		fill: #4AA6D7 !important;
		background: transparent !important;
	}
	.search-wrapper input {
		border: 1px solid #111111 !important;
		background: #474747 !important;
	}
	.search-wrapper:active input,
	.search-wrapper input:focus {
		border-color: #4AA6D7 !important;
		box-shadow: none !important; 
	}
	.search-wrapper .search-label,
	.search-wrapper .search-button {
		fill: #919191 !important;
	}
}

Ein ergänzender Tipp:
Ich weiß ja nicht, wie‘s euch damit geht – ich jedenfalls finde den Pocketkram und "Wichtigste Seiten" auf der Startseite ebenso unnütz wie störend. Aber das Anpinnen von Seiten als Schnellstart finde ich durchaus brauchbar.
Die Anzahl der angezeigten Schnellstartkästchen läßt sich beliebig erhöhen: Shift+F2 (Entwickler-Symbolleiste), Wert reinkopieren, Leerzeichen, Enter

pref set browser.newtabpage.activity-stream.topSitesCount 42 

Wenn die automatisch nachrückenden Seiten der zahlenden Kundschaft stören:

pref set browser.newtabpage.activity-stream.default.sites https://bbs.archlinux.de/index.php,https://www.archlinux.de/packages 

(Damit eine Scrollbar eingeblendet wird, falls die erweiterte Schnellstartseite nicht mehr in‘s Fenster passt, habe ich in userContent.css auf "overflow: auto;"" korrigiert.)

Beitrag geändert von Werner (13.12.2017 19:29:39)

Offline

#93 19.03.2018 19:40:02

Gering-ding-ding-ding-din
Gast

Re: Eure brauchbarsten Funktionen

Upgrade-Skript für (systemd-basierte) Dual-/Multi-Boot-Systeme.

Wenn man neben Arch noch weitere Linux-Installationen auf der Platte hat, die man vielleicht selten braucht, oder die aus irgendeinem Grund halt dort herumliegen, ist es imo etwas nervig, wenn man jedes mal neu booten muss, nur um diese anderen Systeme upgrade-frisch zu halten.

Darum habe ich mir ein kleines Wrapper-Skript gemacht, welches eine andere systemd-basierte Linux-Installation in einen systemd-nspawn Container lädt, dort das Upgrade durchführt und den Container danach wieder schließt.

Hier am Beispiel eines daneben installierten LinuxMint':

#!/bin/bash
  
declare DEVICE='/dev/mapper/VG0_SSD-linuxmint'
declare MOUNTPOINT='/home/user/mnt/linuxmint'
declare UPGRADE_COMMAND='mintupdate-tool -k -l12345 upgrade'

# handle mount point
declare -i DONT_UMOUNT=0
if mount | grep -qE "${DEVICE} on ${MOUNTPOINT}"; then
  let DONT_UMOUNT++
else
  mount "${DEVICE}" "${MOUNTPOINT}" || exit 1
fi

# handle dns resolution
declare NAMESERVER=$(grep -m1 ^nameserver /etc/resolv.conf)

# run upgrade inside container
systemd-nspawn -D "${MOUNTPOINT}" /bin/bash << EOF
if ! grep -q ^nameserver /etc/resolv.conf; then
  if [[ -h /etc/resolv.conf ]]; then
    if ! [[ -e \$(\\ls -l /etc/resolv.conf | cut -f12- -d' ') ]]; then
      install -D /dev/null \$(\\ls -l /etc/resolv.conf | cut -f12- -d' ')
    fi
    echo "${NAMESERVER}" > \$(\\ls -l /etc/resolv.conf | cut -f12- -d' ')
  else
    echo "${NAMESERVER}" > /etc/resolv.conf
  fi
fi
${UPGRADE_COMMAND}
df -Th | \\grep -E "(Filesystem|${DEVICE})"
EOF

# handle mount point
if [[ ${DONT_UMOUNT} -eq 0 ]]; then
  umount "${MOUNTPOINT}"
fi

#94 19.04.2018 09:48:42

Gering-ding-ding-ding
Gast

Re: Eure brauchbarsten Funktionen

Wenn man sich schnell mal was aus den testing-repos installieren möchte:

pac-testing.sh
------------------------------
#!/bin/bash

[[ -z "$@" ]] && pacman -h | sed "s|pacman|$0|g" && exit 0

declare CONFIG_DIR="$(mktemp --tmpdir -d XXXXXXXX)"
declare CONFIG_FILE="$(mktemp ${CONFIG_DIR}/XXXXXXXX)"

cat /etc/pacman.conf | sed 's|core|testing|' | sed 's|community|community-testing|' \
  > ${CONFIG_FILE}

pacman --config ${CONFIG_FILE} $@

rm -r ${CONFIG_DIR}

Beispiel:

$ pac-testing.sh -Ss virtualbox
community-testing/virtualbox 5.2.10-1 [installed: 5.2.8-1]
...

# pac-testing -S virtualbox
resolving dependencies...
looking for conflicting packages...
...
--> installiert virtualbox aus [community-testing]

[ot]
Ob es sinnvoll wäre, ein Thema namens "Eure brauchbarsten Skripte" zu erstellen? o.O
[/ot]

#95 19.04.2018 11:06:01

stefanhusmann
Moderator

Re: Eure brauchbarsten Funktionen

Dieser Code

sed 's|core|testing|' | sed 's|community|community-testing|'

ist nicht ganz akkurat, obwohl es wohl eher die seltenen Fälle sind, in denen es zu Problemen kommen kann. Der unterstützte Weg, [testing] oder [community-testing] zu aktivieren, ist, sie vor den stabilen Repos einzubinden, aber diese Repos aktiviert zu lassen. Es kann theoretisch durchaus sein, dass ein Paket aus [testing] als neue Abhängigkeit ein Paket aus [core] benötigt, das aber selbst nicht in [testing] ist.

Offline

#96 19.04.2018 11:44:16

GerBra(offline)
Gast

Re: Eure brauchbarsten Funktionen

Gering-ding-ding-ding schrieb:

Wenn man sich schnell mal was aus den testing-repos installieren möchte:

Ich fände es einfacher, gleich eine eigene /etc/pacman-testing.conf zu haben (mit den Anmerkungen von Stefan), und diese dann mit @TheRealPacman zu verwenden, ggf. sogar mit einem eigenen Sync-Datenbank-Verzeichniss. Zur Not noch nen Alias auf das Ganze.

#97 20.04.2018 02:56:44

Gering-ding-ding-ding
Gast

Re: Eure brauchbarsten Funktionen

stefanhusmann schrieb:

Dieser Code

sed 's|core|testing|' | sed 's|community|community-testing|'

ist nicht ganz akkurat, obwohl es wohl eher die seltenen Fälle sind, in denen es zu Problemen kommen kann. Der unterstützte Weg, [testing] oder [community-testing] zu aktivieren, ist, sie vor den stabilen Repos einzubinden, aber diese Repos aktiviert zu lassen. Es kann theoretisch durchaus sein, dass ein Paket aus [testing] als neue Abhängigkeit ein Paket aus [core] benötigt, das aber selbst nicht in [testing] ist.

Danke, ich hab's entsprechend abgeändert.


Leider ist das Skript jetzt viel länger und enthält viel repititiven Code. Ich weiß aber im Moment nicht, wie es sich noch besser refaktoren ließe...

Variante #1 schreibt die mirror-Liste von [core] unter [testing], die von [community] unter [community-testing], und falls [multilib] aktiv ist die von [multilib] unter [multilib-testing].

pac-testing.sh
---------------------------
#!/bin/bash

[[ -z "$@" ]] &&  pacman -h | sed "s|pacman|$0|g" && exit 0

declare TMP_CONFIG_DIR="$(mktemp --tmpdir -d XXXXXXXX)"
declare TMP_CONFIG_FILE="$(mktemp ${TMP_CONFIG_DIR}/XXXXXXXX)"

declare -a PAC_CONF

mapfile < /etc/pacman.conf PAC_CONF

declare IFS=$'\n'
for INDEX in ${!PAC_CONF[@]}; do
  if [[ "${PAC_CONF[$INDEX]}" =~ ^\[core\] ]]; then
    echo "[testing]" >> ${TMP_CONFIG_FILE}
    echo "${PAC_CONF[$(( $INDEX + 1 ))]}" >> ${TMP_CONFIG_FILE}
    echo -n "${PAC_CONF[$INDEX]}" >> ${TMP_CONFIG_FILE}

  elif [[ "${PAC_CONF[$INDEX]}" =~ ^\[community\] ]]; then
    echo "[community-testing]" >> ${TMP_CONFIG_FILE}
    echo "${PAC_CONF[$(( $INDEX + 1 ))]}" >> ${TMP_CONFIG_FILE}
    echo -n "${PAC_CONF[$INDEX]}" >> ${TMP_CONFIG_FILE}

  elif [[ "${PAC_CONF[$INDEX]}" =~ ^\[multilib\] ]]; then
    echo "[multilib-testing]" >> ${TMP_CONFIG_FILE}
    echo "${PAC_CONF[$(( $INDEX + 1 ))]}" >> ${TMP_CONFIG_FILE}
    echo -n "${PAC_CONF[$INDEX]}" >> ${TMP_CONFIG_FILE}

  else
    echo -n "${PAC_CONF[$INDEX]}" >> ${TMP_CONFIG_FILE}

  fi
done

pacman --config ${TMP_CONFIG_FILE} $@

rm -r ${TMP_CONFIG_DIR}

Variante #2 aktiviert einfach die bereits vorhandenen, aber auskommentierten Einträge.

#!/bin/bash

[[ -z "$@" ]] &&  pacman -h | sed "s|pacman|$0|g" && exit 0

declare TMP_CONFIG_DIR="$(mktemp --tmpdir -d XXXXXXXX)"
declare TMP_CONFIG_FILE="$(mktemp ${TMP_CONFIG_DIR}/XXXXXXXX)"

declare PAC_CONF_FILE='/etc/pacman.conf'
declare -a PAC_CONF

mapfile < ${PAC_CONF_FILE} PAC_CONF

declare IFS=$'\n'
for INDEX in ${!PAC_CONF[@]}; do
  if [[ "${PAC_CONF[$INDEX]}" =~ ^\#\[testing\] ]]; then
    echo -n "${PAC_CONF[$INDEX]:1}" >> ${TMP_CONFIG_FILE}
    echo "${PAC_CONF[$(( $INDEX + 1 ))]:1}" >> ${TMP_CONFIG_FILE}

  elif [[ "${PAC_CONF[$INDEX]}" =~ ^\#\[community-testing\] ]]; then
    echo -n "${PAC_CONF[$INDEX]:1}" >> ${TMP_CONFIG_FILE}
    echo "${PAC_CONF[$(( $INDEX + 1 ))]:1}" >> ${TMP_CONFIG_FILE}

  elif [[ "${PAC_CONF[$INDEX]}" =~ ^\#\[multilib-testing\] ]]; then
    if grep -q -E '^\[multilib\]' ${PAC_CONF_FILE}; then
      echo -n "${PAC_CONF[$INDEX]:1}" >> ${TMP_CONFIG_FILE}
      echo "${PAC_CONF[$(( $INDEX + 1 ))]:1}" >> ${TMP_CONFIG_FILE}
    fi

  else
    echo -n "${PAC_CONF[$INDEX]}" >> ${TMP_CONFIG_FILE}

  fi
done

pacman --config ${TMP_CONFIG_FILE} $@

rm -r ${TMP_CONFIG_DIR}

Ich konnte mich nicht entscheiden, aber wahrscheinlich ist Variante #2 besser...

#98 20.04.2018 03:08:28

Gering-ding-ding-ding
Gast

Re: Eure brauchbarsten Funktionen

GerBra(offline) schrieb:

Ich fände es einfacher, gleich eine eigene /etc/pacman-testing.conf zu haben (mit den Anmerkungen von Stefan), und diese dann mit @TheRealPacman zu verwenden, ggf. sogar mit einem eigenen Sync-Datenbank-Verzeichniss. Zur Not noch nen Alias auf das Ganze.

Genau das hatte ich vorher und es hat mich ehrlich gesagt ziemlich genervt, meine pacman-Konfiguration immer in zwei Dateien pflegen zu müssen und jedes mal zu kontrollieren, ob die zweite Konfigurationsdatei auch schon alle Änderungen der ersten übernommen hat.

Weil ich diese doppelte Pflegearbeit ziemlich umständlich fand, hab ich mir dieses Skript gemacht.

#99 20.04.2018 15:17:30

GerBra
Mitglied

Re: Eure brauchbarsten Funktionen

Gering-ding-ding-ding schrieb:

Weil ich diese doppelte Pflegearbeit ziemlich umständlich fand, hab ich mir dieses Skript gemacht.

Verständlich. Ich bin da eher von mir ausgegangen, bei mir ändert sich die pacman.conf eigentlich kaum.

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums