ubuntuusers.de

Basheinzeiler

Ausbaufähige Anleitung

Dieser Anleitung fehlen noch einige Informationen. Wenn Du etwas verbessern kannst, dann editiere den Beitrag, um die Qualität des Wikis noch weiter zu verbessern.


Anmerkung: Mehr interessante Einzeiler sind gerne erwünscht

Sammlung von praktischen Einzeilern in der Bash. Diese einzeiligen "Skripte" geben auch gleich eine praktische Verwendung diverser Funktionen an.

Sortierte Liste

Stammt aus diesem Thread. Diese Zeile findet alle Dateien im Verzeichnis dir, die mit ".mp3" enden (Groß- und Kleinschreibung wird wegen -iname ignoriert), sortiert die gefundenen Dateien und schreibt sie in die Datei sortierteliste.

find dir -iname "*.mp3" | sort > sortierteliste 

Leere Dateien auflisten

Um herauszufinden, ob Dateien in einem Verzeichnis leer sind, gibt es verschiedene Möglichkeiten, z.B.

echo $(du -h * | grep ^0 | awk '{print $2}') | sed "s/\s/, /g" 

Zuerst listet "du -h *" die Größe aller Dateien in * auf. Anschließend werden nur diejenigen Textzeilen herausgefiltert, die mit einer 0 anfangen. Anschließend wird die zweite Spalte der Darstellung genommen. Das "echo $(...)" bewirkt, dass alle Zeilen nacheinander durch Leerzeichen getrennt ausgegeben werden. Durch den sed-Befehl bewirkt man, dass die Leerzeichen durch ", " ersetzt werden.

Einfacher geht es mit diesem Befehl:

find -type f -empty 

Dieser Einzeiler öffnet alle HTTP(S)-Links, die alleine in einer Zeile stehen mit dem Standard-Browser.

grep -E '^https?://' datei | xargs xdg-open 

Möchte man auch andere Protokolle unterstützen, lässt sich das wie folgt machen:

grep -E '^(https?|ftp)://' datei | xargs xdg-open 

Dieses Skript findet neben HTTP- auch FTP-Links.

Die größten Verzeichnisse/Dateien

Die 5 größten Verzeichnisse je Partition

Mit diesem Einzeiler werden die 5 größten Verzeichnisse je eingebundener Partition ermittelt und die Größe in GB und Bytes sowie der Name ausgegeben.

PART=($(awk '$1~/^\/dev/ {print $2}' /proc/mounts));for i in ${PART[@]};do echo;df -h $i;sudo du --max-depth=1 -kx $i|sort -nr|awk '{printf("%7.1f GB\t%s\n", ($1/1024)/1024,$0)}'|head -n6;done  

Die 15 größten Verzeichnisse im Dateisystem

Mit diesem Einzeiler werden die 15 größten Verzeichnisse, ab dem Ausführungsverzeichnis, ermittelt und die Größe in GB und Bytes sowie der Name ausgegeben.

sudo du -kSx | sort -nr | awk '{printf("%7.1f MB\t%s\n", ($1/1024)/1024,$2)}' | head -15 

Die 5 größten Dateien je Partition

Mit diesem Einzeiler werden die 5 größten Dateien je eingebundener Partition ermittelt und die Größe in GB und Bytes sowie der Name ausgegeben.

ARCH=($(awk '$1~/^\/dev/ {print $2}' /proc/mounts));for i in ${ARCH[@]};do sudo find $i -type f -printf "%k %p \n" 2>/dev/null|sort -rn|awk '{printf("%7.1f MB\t%s\n", ($1/1024)/1024, $0)}'|head -n6;echo;done 

Die 15 größten Dateien auflisten

Durchsucht ab dem Ausführungsverzeichnis alle Verzeichnisse und listet die 15 größten davon auf. Ausgabe: Größe MB und Bytes sowie Name der Datei.

find / -type f -printf "%k\t %p\n" 2>/dev/null | sort -rn | awk '{printf("%7.1f GB\t%s\n", ($1/1024)/1024,$0)}' | head -15 

Prüfsummen für gesamtes Verzeichnis berechnen

Der folgende Befehl berechnet die MD5-Prüfsummen aller Dateien innerhalb des aktuellen Verzeichnisses und seiner Unterverzeichnisse und speichert das Ergebnis in der Datei MD5SUMS ab, was je nach Anzahl und Größe der Dateien etwas dauern kann. Voraussetzung ist die Installation des Pakets md5deep (universe), weil das von Ubuntu mitgelieferte Tool md5sum nicht rekursiv arbeitet.

md5deep -rel * > MD5SUMS 

Mit Hilfe von find kann man jedoch auf die Installation von md5deep verzichten. Der folgende Befehl durchsucht das aktuelle Verzeichnis und seine Unterverzeichnisse nach regulären Dateien (also keine Verzeichnisse, Gerätedateien [3] o.ä.) und ruft dann md5sum auf:

find . -type f -exec md5sum {} + > MD5SUMS 

Statt md5sum kann natürlich auch ein anderer Befehl genutzt werden (z.B. für einen SHA-Algorithmus statt MD5). Die Programme befinden sich üblicherweise in /usr/bin:

ls /usr/bin/*sum 

Auflisten aller eingehangenen Partitionen

Die eingehängten Partitionen lassen sich wie unter Systeminformationen ermitteln (Abschnitt „Eingehaengte-Festplatten“) angegeben anzeigen. Für Swap-Partitionen siehe Swap überwachen.

Auflistung sources.list, incl. Unterverzeichnisse

Auflistung der aktiven Einträge der sources.list und der Listen aus /etc/apt/sources.list.d/, ohne Kommentar- und Leerzeilen.

Mit grep (mit Dateinamen): sources.list (Abschnitt „Support“)

Und mit sed (ohne Dateinamen):

sed '/^[ \t]*#\|^[ \t]*$/d' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 

Partitionstabellen

Hinweis:

Bei den Partitionstabellen wird von einer logischen Sektorgöße von 512 Byte ausgegangen. Die Angabe des Datenträgers[3] muss auf die eigenen Belange[4] abgestellt werden.

Hexdump des MBR

Hexdump des Datenträgers sdX[4]:

sudo hexdump -s0 -n512 -C /dev/sdX 

Nur die Partitionen-Einträge lesbar ansehen:

sudo hexdump -s 446 -n 64 -v -e '1/1 "Part.:| %02x" 3/1 " | %3u" 1/1 " | %02x" 3/1 " | %3u" 2/4 " | %9u" "\n"' /dev/sdX  

Hexdump des GPT-Primary-Headers

Hexdump des Datenträgers sdX[4] ohne Partitionen-Einträgen:

sudo hexdump -s512 -n512 -C /dev/sdX 

Hexdump des Datenträgers sdX mit Partitionen-Einträgen:

sudo hexdump -s512 -n$((512*33)) -C /dev/sde  

Hexdump des GPT-Secondary-Headers

Zum Ausführen des Kommandos wird das Programm sgdisk benötigt, da es die Ende-Sektoren ermittelt.

Hexdump des Datenträgers sdX[4] ohne Partitionen-Einträgen:

d=sdX;sudo dd if=/dev/$d skip=$(($(sudo sgdisk -p /dev/$d|sed -ne 's@Disk /dev/'$d': \([0-9].*\) s.*$@\1@p')-1)) 2>/dev/null|hexdump -C 

Hexdump des Datenträgers sdX mit Partitionen-Einträgen:

d=sdX;sudo dd if=/dev/$d skip=$(($(sudo sgdisk -p /dev/$d|sed -ne 's@Disk /dev/'$d': \([0-9].*\) s.*$@\1@p')-33)) 2>/dev/null|hexdump -C 

Bestimmte Dateien aus Verzeichnisstruktur entfernen

Rekursives Löschen von Dateien, auf die ein bestimmtes Muster zutrifft.

find srcPfad -name "*.typ" -type f -delete 

Suche nach Dateien auf ein Verzeichnis dir2 einschränken

Wenn man

cdfind() {
    cd $2;
    find -iname "*$1*";
}

in einer Datei .bash_aliases speichert, dann mit

source .bash_aliases 

die Funktion cdfind() lädt, dann liefert der Befehl

cdfind suchbegriff /pfad-zu-dir2/dir2 

Treffer, die im Verzeichnis dir2 oder in einem der Unterverzeichnisse gespeichert sind und irgendwo im Dateinamen die Zeichenfolge suchbegriff enthalten. Die Option -iname in cdfind() sorgt dafür, dass kein Unterschied zwischen Groß- und Kleinschreibung gemacht wird. Wenn gewünscht ist, dass cdfind() automatisch beim PC-Start geladen wird, dann geht man vor, wie im Abschnitt alias (Abschnitt „Dauerhafte-Verwendung“) bezogen auf Aliases beschrieben ist.

Die Funktion gwfind()

gwfind() {
    cd $2;
    find . -type f -name "*.*" -exec grep -iH "$1" {} \;
}

ist ähnlich wie cdfind() aufgebaut mit dem Unterschied, dass durch die Verwendung von grep so

gwfind suchbegriff /pfad-zu-dir2/dir2 

die Inhalte von Dateien durchgesucht werden.

Bilder suchen

Sucht man ein Bild auf seinem System, von dem man den Namen nur in etwa kennt, aber weiß, wie das Bild aussieht, so kann man mit locate eine Liste aller möglichen Dateien generieren und mit gThumb diese Liste gleich ansehen. Also z.B.

gthumb $(locate email | grep .png) 

⚓︎

Öffentliche IP-Adresse anzeigen

Viele Internet-Benutzer besitzen ein externes DSL-Modem/Router. In diesem Fall kann man mit ip addr nur die lokalen IP-Adressen auslesen. Folgender Einzeiler gibt die öffentliche IP-Adresse auf der Standardausgabe aus:

wget https://whatsmyip.de/ -q -O - | grep -Eo -e '[0-9]{1,3}(\.[0-9]{1,3}){3}' -e '[0-9A-Fa-f]{0,4}(:[0-9A-Fa-f]{0,4}){2,7}' 

Die Seite https://whatsmyip.de/ 🇬🇧 zeigt einem allerdings inzwischen eine falsche IP. Man sollte daher im obigen Befehl alternativ verwenden:

Hier noch eine Abfragemöglichkeit ohne grep und mit http://showip.spamt.net/

wget -q -O - http://showip.spamt.net/ 

Bei IPv6 wird die interne Adresse auch im Internet verwendet:

ip -6 addr show scope global | grep -o -e 'inet6 [23][0-9:A-Fa-f]*' | grep -o -e '[^ ]*$' 

Man kann aber auch ein API verwenden (hier: http://www.wieistmeineipv6.de):

wget -q -O - http://6.wieistmeineipv6.de/ip_js.php | grep 6_ip | cut -d\" -f2 

Hintergrundbild mit feh und cron alle 30 Minuten zufällig wechseln lassen

Hier ein interessanter Befehl, der das Hintergrundbild zufällig mit Feh wechselt. Dies kann man dann noch in Cron eintragen und so wird dann alle 30 Minuten (kann natürlich angepasst werden) das Hintergrundbild gewechselt.

set -f; O=$IFS IFS=$'\n' files=($(find ~/Bilder/ -name '*')) IFS=$O; set +f && feh --bg-scale ${files[ $(( $RANDOM % ${#files[@]} )) ]} 

Mit

crontab -e 

kann man die Crontabelle editieren.

Die Tabelle könnte dann so aussehen:

#-----------------------------------------------------------------
# Shell variable for cron
SHELL=/bin/bash
# PATH variable for cron
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11
#M   S    T M W   Befehl
#-----------------------------------------------------------------
*/30 *    * * *   set -f; O=$IFS IFS=$'\n' files=($(find ~/Bilder/ -name '*')) IFS=$O; set +f && feh --bg-scale ${files[ $(( $RANDOM % ${#files[@]} )) ]}
#-----------------------------------------------------------------

Mailbox für Benutzer auslesen und bearbeiten

Die Parameter "-u" und "-f" dürften klar sein, "Z" geht an das Ende der Mailqueue, "d" löscht und "-N" leitet die Ausgabe auf >dev/nul um.

Es werden die zuletzt eingegangen E-Mail-Header des Benutzers "user" als Liste angezeigt.

echo "Z" | mail -u user -f /home/user/Maildir/ 

Es wird die älteste E-Mail (Nr. 1) des Benutzers "user" gelöscht.

echo "d 1" | mail -N -u user -f /home/user/Maildir 

Dateiliste aus einem 7zip-Archiv erzeugen

Üblicherweise wird der Inhalt eines 7zip-Archivs mit dem Befehl

7z l Name_der_Archivdatei.7z 

angezeigt. Die Ausgabe enthält jedoch einige zusätzliche Informationen, die bei der Bearbeitung durch weitere Befehle stören können. Geht es einem also darum, eine reine Dateiliste zu erzeugen, dann hilft folgender Einzeiler weiter:

7z l Name_der_Archivdatei.7z | sed -n '/----/,/----/p' | sed '/----/d' | cut -c54- > Dateiliste.txt 

Praktischer Anwendungsfall: Es gibt eine größere Archivdatei. Man möchte herausfinden, ob (und ggf. wo) sich die archivierten Dateien noch auf der Platte befinden. Nach Erstellen der Liste mit obenstehenden Einzeiler kann man über eine while-read-Schleife mit Hilfe des Befehls find nach diesen Dateien suchen lassen.

Systemlog durchsuchen

Meistens kommt man mit einer automatischen Suche im Systemlog schneller zu Ziel als beim eigenen Lesen. Beispielsweise kann man so den Zeitpunkt des letzten Erwachens aus dem Ruhezustand abfragen:

  • grep 'Finished .* Suspend' /var/log/syslog | tail -n1 

    oder

  • journalctl -b -u systemd-suspend.service | grep returned | tail -n1 

Diese Revision wurde am 20. Oktober 2024 09:02 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Shell