CLI Snippets / Kommandozeilen Schnipsel

Phillip Richdales immensely practical collection of CLI snippets (and learn a little German along the way 😉 )

Phillip Richdales unglaublich praktische Sammlung an Kommandozeilenschnippseln

Tar Gz a directory

tar czf my-backup.tar.gz my-backup

rsync ‘update’ operation (Quelle zu Ziel kopieren ohne zu überschreiben) /
rsync ‘update’ operation (copy from source to target without overwriting files in the target)

rsync -tr /my/source/directory/* /mein/ziel/verzeichnis

Dateien im aktuellen Verzeichnisbaum nach String durchsuchen /
search for a keyword in a directory-tree

grep -rn 'SEARCHWORD' *

Vorhandenes Git Repo in ein einfaches repo ohne Checkout/Arbeitskopie verwandeln /
Turn repos into pure storage repos, without checkout: Execute the following command in your remote repository folder:

git config --bool core.bare true

Dann alle Dateien außer dem .git Verzeichnis löschen – dann kann man ohne Fehler von fernen Git Repos aus auf dieses Pushen /
Then delete all the files except .git in that folder. And then you will be able to perform git push to the remote repository without any errors.


cvs Verzeichnisse rekursiv in einem Verzeichnisbaum löschen /
Remove CVS Dirs recursively (exec in toplevel project dir):

find . -name CVS -prune -exec rm -rf {} \;

Git Origin zu einem Git Repo / Arbeitsverzeichnis hinzufügen / Add Git Origin:

git remote add origin developer@mybox.local:/home/developer/projekte/[PROJEKTNAME]/git-repos

Frisches leeres Git Repo erzeugen / Create Git bare repository:

git --bare init

Leeres Projektverzeichnis auf Host initialisieren um es dann zu klonen (Beispiel, Git, spezielles Skript) / Initialize empty project-dir to then be able to clone it (example, Git, special script):

developer@devbox:>sh ../scripts/createProjectRepos.sh myWebProject.com

Hinweis: Wenn man ein neues Projekt so herum aufzieht, ist nach dem Klonen nach Lokal ein Setzen von ‘origin’ nicht mehr nötig.

Note: If you set up a project with Git versioning this way, you won’t have to (re)set origin after cloning to your local working copy.


CVS Metadata aus einem Projektverzeichnis entfernen (d.h. einen CVS Checkout aus der CVS Versionierung entfernen, um z.B danach ein Git versioniertes Projekt daraus zu machen) – im Rootverzeichnis des Projekts ausführen:

rm -rf `find . -name CVS`

Alternative (für große Projekte mit sehr vielen CVS Metadataverzeichnissen, benutzt nicht den CLI Puffer um eine Liste der CVS Dirs zu speichern):

find . -name CVS -exec rm -rf {} ;

untar & ungzip in einem Arbeitsgang:

tar -zxvf myfile.tar.gz

apt-get update ohne Expired Fehler / avoid Expired problems when using apt-get update:

apt-get -o Acquire::Check-Valid-Until=false update

updatedb auf neueren macos installationen ermöglichen (z.B. macos Sierra):

printf "\nalias updatedb='sudo /usr/libexec/locate.updatedb'" >> ~/.bash_profile

updatedb auf OS X ermöglichen:

sudo ln -s /usr/libexec/locate.updatedb /usr/bin/updatedb

updatedb auf OS X El Capitan ermöglichen:

ln -s /usr/libexec/locate.updatedb /usr/local/bin/updatedb

MAMP MySQL client symlinken (OS X):

sudo ln -s /Applications/MAMP/Library/bin/mysql /usr/bin/mysql

auf MySQL client einloggen (OS X):

mysql --host=localhost --user=myname --password=mypass mydb

Ausgabe zurechtschneiden (hier alle Zeichen bis 120 stehen lassen, alles danach wegschneiden, Beispiel mit grep-Suche):

grep -rn "SUCHWORT" * | cut -c -120

Auf OS X Maveriks und ggf. frühere Versionen unsichtbare Dateien und Verzeichnisse sichtbar machen:

defaults write com.apple.finder AppleShowAllFiles YES

Danach “Alt” gedrückt halten und im Dock mit Rechtsklick auf den Finder gehen und neu Starten.


Ein Script mit setuid so mit Rechten versehen, dass es immer als root läuft:

chmod u+s meinSkript.sh

Git: Zeige eine Liste der Dateien, die zwischen release-001 und release-002 geändert wurden:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT release-001 release-002

Git: Zeige eine Liste der Dateien, die zwischen release-002 und HEAD geändert wurden:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT release-002 HEAD

Tags aus einen Output Dump entfernen, mit sed (Beispiel mit PHP):

php somePhpFile.php | sed 's,<[^>][^>]*>,,g' > strippedOfTags.txt

sed – Tags aus einen Output Dump entfernen (variante (testen)):

php someOtherPhpFile.php | sed 's,<[^>][^>]*>,,g' > otherStrippedOfTagsDump.txt

grep + sed – “Debugging für Arme”: Output nach “myout: “ durchsuchen und “myout: “ entfernen und die Zeile ausgeben /
grep + sed – “Poor Mans Debugging” Search output for “myout: “, delete “myout: ” and output the remaining line

scriptThatGeneratesStandardOutput.php | grep "myOut: " | sed 's,myOut: ,,g'

Wörter Zählen / Count the word ‘<record>’
Beispiel mit grep / example with grep

grep -o -w '<record>' mydata.xml | wc -w

Untar.gz a file (add v to options for verbose) / Eine tar.gz Datei entpacken:

tar -xzf MyTarArchive.tar.gz

Find all files starting with ._ in the Filename and delete them. Recursive Directory traversal.

find . -type f | grep ._ | xargs rm

Same thing. (alternative):

find . -iname '._*' -exec rm -rf {} \;

scp recursive copy of dir to remote location / mit scp rekursiv von einem Verzeichnis zu einem fernen Verzeichnis kopieren:

scp -r foo your_username@remotehost.com:/some/remote/directory/bar

rename group name on FOSS *nix:

groupmod --new-name NEW_GROUP_NAME OLD_GROUP_NAME

Linux (Ubuntu 14.04 LTS and newer) – Disable suspend mode with closed lid: Edit the /etc/systemd/logind.conf file and uncomment/modify/add the line:

HandleLidSwitch=ignore

… then …

restart systemd-logind

Linux (Debian, Ubuntu) – Reconfigure timezone setting

dpkg-reconfigure tzdata

Offene Dateien im aktuellen Verzeichnis auflisten; praktisch um herauszufinden welche Dateien eine Aktion auf das Verzeichnis (z.B. löschen) verhindern / List open files in current directory; practical to find out which files are preventing actions on that directory (f.e. deleting)

lsof +D .

User unter Linux auf einen anderen Namen und ein anderes Homeverzeichnis verschieben (als Root) / Move a user to a different name and a different home directory under Linux (as root)

usermod -l newusername -m -d /home/newusername oldusername

In VirtualBox die uuid einer virtuellen Festplatte neu generieren und Kollisionen bei kopierten virtuellen Maschinen zu vermeiden / Regenerate a uuid in a virtual hdd in order to avoid collisions after copying a VM

VBoxManage internalcommands sethduuid /absolute/path/to/vm/VmDrive.vdi

find . -name \*.txt -print

Fix local root (or other users) mysql/mariadb privileges on Ubuntu Linux:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
GRANT ALL ON *.* TO 'root'@'localhost';

Skaliere alle jpg Bilder im Verzeichnis auf 1800 Pixel Breite:

for file in *.jpg; do convert $file -resize 1800x $file; done