Archiv der Kategorie: Shell

Shell: Rekursiv Dateitypen ermitteln und zählen

Manchmal möchte man wissen, welche Dateitypen und wieviele davon in einem Ordner (mit Unterordnern) abgelegt sind.

Lösung:

find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq -c

Die Ausgabe sieht dann in etwa so aus:

32 doc
49 docx
3 gif
147 jpg
61 mp4
562 pdf
60 png

Sollen nur die unterschiedlichen Extensions ermittelt werden reicht:

find . -type f -name '*.*' | sed 's/.*\.//' | sort -u

Ausgabe:
doc
docx
gif

Wenn Endungen in Groß- und Kleinbuchstaben vorliegen (.PNG, .png) hilft ein Filter vor dem sort-Befehl ( tr ‚[A-Z]‘ ‚[a-z]‘ für lowercase):

find . -type f -name '*.*' | sed 's/.*\.//' | tr '[A-Z]' '[a-z]' | sort -u

Postgres: Alter table SET WITHOUT OIDS für alle Datenbanken und Tabellen

Spätestens bei Upgrade auf die Version 12 gibt es Probleme mit den OIDS in Postgresql.

Dieses seit 2005 als „deprecated“ gekennzeichnete Feature wird ab Version 12 nicht mehr unterstützt und führt zu Fehlern (vorher: Warnungen).

Wenn man sich sicher ist, dass OIDs in Datentabellen nicht mehr gebraucht werden, dann hilft ein kleines Script, daß die Arbeit ohne großen Aufwand übernimmt.

https://pastebin.com/3JZLM5YT

Hier werden erst alle Datenbanken aus der pg_database-Tabelle (DB: postgres) ausgelesen und dann über jede Datenbank die Tabellen iteriert, um die OIDS abzustellen.

Aufruf des Scriptes als User „postgres“:

sudo su postgres

Shell: Lokaler Webserver ohne Apache2/nginx mit Python, PHP oder node js

manchmal soll auf die Schnelle eine HTML- oder Javascript-Datei getestet werden, ohne das ein Webserver im System installiert ist (zB Apache2 oder nginx). Abhilfe können hier Python, PHP oder node js als installierte Skript-Sprachen bieten.

PHP (muss installiert sein):
In den Ordner wechseln, in dem die ausführbaren Datein liegen (zB index.php oder index.html). Hier wird der eingebaute Server (-S, grosses „s“) für Port 8000 aufgerufen.

php -S localhost:8000

Python (muss installiert sein, Annahme: Python3):
In den Ordner wechseln, ind em die ausführbaren Datein liegen (zB main.py oder index.html).

python -m http.server 8000 --bind 127.0.0.1

Python ruft hier das http.server Modul auf, verbindet es mit Port 8000 und bindet es an die lokale IP 127.0.0.1 (sonst wären auch Zugriffe mit anderen IP’s möglich)

node js (muss installiert sein):

npm install -g http-server
http-server

Npm ist der Paket-Amanager von node js und wird mit diesem installiert. Die Zeile „npm install ..“ muss natürlich nur beim ersten Mal aufgerufen werden, um das http-server Paket zu installieren. Danach wird in den ordenr mit den auszuführenden Dateien gewechselt und „http-server“ aufgerufen.

Shell: Festplatte mit dd klonen ohne Softwareinstallation

Eine ältere Festplatte macht Geräusche: Zeit, das Laufwerk auf eine neue HDD/SSD zu ziehen. Für Windows gibt es zahlreiche Programme.

CloneZilla ist eine freies Tool für Linux setzt aber die Erstellung einer Boot-CD/USB-Stick voraus. Wer einfach nur eine Platte kopieren möchte, der kann das auch mit den Linux Bordmitteln „dd“ erledigen. Ausgangs- und Zielplatte müssen dazu unmountet sein.

Dazu im Dateimanager auf der Auswurf-Icon klicken oder via unmount /dev/xxx die Platte aus dem Filesystem nehmen.

Wer die Bezeichnung der Festplatten nicht kennt, kann sich via cat /dev/partitions eine Übersicht ausgeben lassen:

major minor #blocks name
(...)
8     32    117220824 sdc
8     33    116219904 sdc1
8     34    1 sdc2
8     37    998400 sdc5
8     48    244198584 sdd
8     49    244195008 sdd1

Physikalische Platten haben den „major-Type“=8 (loop-Partitions=7, DVD-LW=11, …), an der Größe (blocks) kann man sich orientieren, um ein Laufwerk zu identifizieren.

Im Beispiel soll das Laufwerk /dev/sdc auf /dev/sdd kopiert werden (Daten auf /dev/sdd gehen verloren)

sudo dd bs=4M conv=sync,noerror status=progress if=/dev/sdc of=/dev/sdd
  • if = Inputfile (Laufwerk, das kopiert werden soll)
  • of=Outputfile (Laufwerk, auf das kopiert wird – Daten gehen verloren)
  • status=progress zeigt den Fortschritt an, hilfreich, weil das Kommando eine längere zeit laufen kann
  • bs = Blocksize (hier 4 Megabyte)

Shell: Touch rekursiv

„touch“ ist ein Shell-Programm, dass den Zeitstempel von Dateien ändern kann. Im Normalfall wird der aktuelle Zeitstempel gesetzt. Leider gibt es keine Parameter für rekursive Bearbeitung (über mehrere Verzeichnisebenen).

Abhilfe:

find . -exec touch {} \;

Hier erledigt „find“ das filtern aller Dateien aus den Unterverzeichnissen und über den exec-Parameter wird dann „touch“ aufgerufen.