it-swarm.com.de

Best Practices und Tipps für die Linux-Befehlszeile?

Ich möchte eine Diskussion eröffnen, in der die Best Practices und Tipps für die Linux-Befehlszeile (CLI) zusammengefasst werden.

Ich habe nach einer solchen Diskussion gesucht, um den folgenden Kommentar zu teilen, aber keinen gefunden, daher dieser Beitrag.

Ich hoffe, wir alle konnten daraus lernen.

Sie können gerne Ihre Bash-Tipps, grep, sed, AWK,/proc und alle anderen verwandten Linux/Unix-Systemadministrationen sowie Best Practices für die Shell-Programmierung zum Nutzen von uns allen teilen.

112
Maxim Veksler

Verwenden Sie Bildschirm , einen freien Terminal-Multiplexer, der vom GNU Projekt entwickelt wurde, mit dem Sie mehrere Terminals in einem haben können.

Sie können eine Sitzung starten und Ihre Terminals werden auch dann gespeichert, wenn Ihre Verbindung unterbrochen wird, sodass Sie später oder von zu Hause aus fortfahren können.

111
jeneriz

SSH!
SSH ist das Gebot Gottes - ich denke, es ist das wertvollste Gesamtgebot, das es zu lernen gilt. Die Optionen können ziemlich entmutigend sein, aber es scheint, als würde ich ständig lernen, neue Befehlszeilenoptionen für SSH zu verwenden, die ich nie für notwendig gehalten hätte. Ich habe sie vielleicht alle an dieser Stelle benutzt.

Je mehr Sie es verwenden, desto mehr lernen Sie darüber. Sie können es verwenden, um einige erstaunliche Dinge zu tun.

Hinweis: ALLE diese Dinge können remote ohne Setup auf Ihrem Server ausgeführt werden, außer wenn der SSH-Server ausgeführt wird.

Mounten Sie ein Dateisystem über das Internet

durchsuche das Netz nach SSHFS

Befehle weiterleiten.

Das SVN + SSH-Protokoll ist Subversion von einem Remote-Client auf einen Server, auf dem NO DEAMON ausgeführt wird! Der SVN-Befehl startet den Server über die ssh-Shell und leitet die Informationen über die vorhandene Pipe hin und her. Das rsync-Programm macht dasselbe, läuft auf einem Server ohne rsync-Deamon, indem es selbst über SSH startet. Es ist einfach, eigene Bash-Dateien zu schreiben, um ähnliche Tricks auszuführen.

Kette um durch Firewalls zu kommen

Ich benutze dies die ganze Zeit, um über meinen Linux-Server zu Hause auf meinen Mac zu springen.

Ports weiterleiten :
Scheint nur mäßig nützlich zu sein, bis Sie feststellen, dass Sie von zu Hause aus durch Ihre Heim-Firewall springen und Ihren Router von zu Hause aus konfigurieren können, als ob Sie dies von Ihrem Heimnetzwerk aus tun würden.

X-Anfragen weiterleiten :

Dies ist eine weitere erstaunliche. Mit oder ohne einen X-Server, der auf Ihrem Remote-System ausgeführt wird, können Sie ein X-Windows-Programm ausführen, und das Fenster wird auf Ihrem lokalen Bildschirm angezeigt. Benutze einfach den Schalter -X, das ist alles!

Da auf Ihrem Remote-Server kein X-Server ausgeführt werden muss, ist die CPU-Auswirkung auf Ihren Server minimal. Sie können einen TINY Linux-Server verwenden, der Ihrem leistungsstarken Spiel-PC unter Windows und Cygwin/X riesige Apps bereitstellt.

Natürlich arbeiten VI und EMACS über SSH, aber wenn ich zu Hause bin, möchte ich manchmal mehr. Ich benutze ssh -X, um eine Kopie von Eclipse zu starten! Wenn Ihr Server leistungsfähiger als Ihr Laptop ist, befindet sich die grafische Benutzeroberfläche direkt auf Ihrem Laptop. Die Kompilierungen werden jedoch auf Ihrem Server durchgeführt. Machen Sie sich also keine Sorgen über die Systemlast.

In Batch-Dateien ausführen

(dh eine lokale Batch-Datei ausführen, die auf anderen Systemen "Sachen macht"):

Zwei Dinge machen diesen cool. Zum einen können Sie Kennwortabfragen entfernen, indem Sie (sicherere) Verschlüsselungsschlüssel verwenden. Zum anderen können Sie einen Befehl in der SSH-CLI angeben. Ich habe dies auf einige interessante Arten verwendet - wie wenn eine Kompilierung auf dem Remote-Server fehlschlägt, würde ich es SSH in meinen Computer haben und eine Sounddatei abspielen).

Denken Sie daran, dass Sie die Ausgabe vom Remote-Befehl umleiten und in Ihrer lokalen Batch-Datei verwenden können, sodass Sie möglicherweise auch eine auf Ihrem Server ausgeführte Kompilierung lokal verfolgen können.

Eingebaut in Mac

Sowohl Server als auch Client sind in Mac und Linux integriert. Bei Mac und Ubuntu ist das Aktivieren eines Servers so einfach wie das Finden des richtigen Kontrollkästchens.

Installieren Sie auf einem PC cygwin oder cygwin/X (mit cygwin/X können Sie Ihre X-Window-Ausgabe von Ihrem Linux-Computer an Ihren Windows-PC weiterleiten - es wird ein X-Server installiert)

Wichtige Tipps/Konfigurationsdatei

Verwenden Sie niemals Port 22 an Ihrer Firewall. Sie werden viele Hack-Versuche bekommen, es lohnt sich einfach nicht. Lassen Sie Ihre Firewall einfach einen anderen Port an Ihren Server weiterleiten.

Es gibt umfangreiche Konfigurationsoptionen, mit denen Sie Ihre ssh-Befehle erheblich vereinfachen können. Hier ist ein Beispiel von mir bei der Arbeit:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Wenn ich "ssh home" (nichts anderes) eingebe, verhält es sich so, als hätte ich Folgendes eingegeben:

ssh -p 12345 [email protected]

und leitet dann meinen lokalen Port 1025 an mein System "mac" zu Hause weiter. Der Grund dafür ist, dass ich einen anderen Eintrag in meiner Datei habe:

Host mac
    hostname localhost
    port=1025

sobald ich ein "ssh home" erstellt habe und das Fenster noch geöffnet ist, kann ich "ssh mac" eingeben, und der Computer, der hier arbeitet, versucht tatsächlich, eine Verbindung zu seinem eigenen Port 1025 herzustellen, der an "mac:" weitergeleitet wurde: 22 "durch den anderen Befehl, so dass eine Verbindung zu meinem Mac zu Hause über die Firewall hergestellt wird.

Bearbeiten - cooles Skript!

Ich habe ein altes Skript ausgegraben, das ich einfach liebe - ich musste zurückkommen und es für jeden hier posten, der interessiert sein könnte. Das Skript heißt "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Wenn Sie dieses Skript in Ihrem Home-Verzeichnis haben und es einen Host gibt, zu dem Sie eine Verbindung herstellen können (über ssh), können Sie "./authMe hostName" eingeben.

Bei Bedarf wird ein öffentliches/privates Schlüsselpaar für Sie erstellt, dann wird es auf den anderen Computer übertragen und Ihr öffentlicher Schlüssel wird kopiert (der Befehl ssh fordert Sie zur Eingabe eines Kennworts auf ...)

Danach sollte der SSH-Befehl beim Anschließen an dieses Remote-System nicht mehr nach Ihrem Kennwort fragen, sondern verwendet das öffentliche/private Schlüsselpaar.

Wenn Ihr Remotecomputer nicht immer sicher ist, sollten Sie eine "Passphrase" festlegen, wenn Sie dazu aufgefordert werden.

Möglicherweise möchten Sie auch den SSH-Server am anderen Ende so konfigurieren, dass für zusätzliche Sicherheit keine Textkennwörter (nur Schlüssel) zugelassen werden.

101
Bill K

Ich benutze gerne

cd -

um zum vorherigen Verzeichnis zu wechseln. Sehr hilfreich!

73
Fortyrunner

Ich habe kürzlich den Befehl pv (Pipe Viewer) entdeckt, der wie cat ist, aber Übertragungsdetails enthält.

Also statt

$ gzip -c access.log > access.log.gz

Sie können verwenden

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Anstatt also keine Ahnung zu haben, wann Ihre Operation beendet sein wird, wissen Sie es jetzt!

mit freundlicher Genehmigung von Peteris Krumins

69
Nick Devereaux
Sudo !!

Führen Sie den vorherigen Befehl erneut als root aus.

[Der aktuelle Top-Befehl auf der Site http://www.commandlinefu.com , eine Site, die nach dem Vorbild dieser Frage gestaltet ist.]

53
codeinthehole

Drücken Sie Strg-R und geben Sie einen Befehl (oder einen Teil davon) ein - es durchsucht den Befehlsverlauf. Wenn Sie erneut Strg-R drücken, wird zur nächsten Übereinstimmung gesprungen, die Eingabetaste führt den aktuell angezeigten Befehl aus, und mit dem Rechtspfeil (mindestens) können Sie ihn zuerst bearbeiten.

$ (reverse-i-search)`svn': svn status

Ich hatte Linux ungefähr 7 Jahre lang als mein Hauptbetriebssystem verwendet, bevor ich davon erfuhr, aber jetzt, wo ich es weiß, ist es ziemlich praktisch.

46
Jonik

Die Kommandozeile ist eine lustige Sache. Ich denke, dass Sie nur so viel alleine lernen können und den Rest lernen Sie versehentlich, wenn Sie jemand anderem über eine Befehlszeile zuschauen.

Ich habe die Shell jahrelang benutzt, um Verzeichnisnamen sorgfältig von Hand einzugeben. Eines Tages sah ich einem Freund zu, wie er an einem System herumspielte, und er drückte immer wieder die Tabulatortaste. Ich fragte "Warum schlägst du Tab?". Antwort: Es wird versucht, das Verzeichnis oder den Dateinamen zu vervollständigen. Wer hätte das gedacht - Tab-Vervollständigung! Geben Sie einen Teil der Datei oder des Verzeichnisses ein, drücken Sie die Tabulatortaste, und es wird versucht, die Eingabe zu beenden (das Verhalten hängt jedoch von der Shell ab).

Eines Tages beobachtete mich ein Freund auf der Kommandozeile und sah zu, wie ich etwas tippte wie:

[email protected] ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
[email protected] /etc $ popd
~/trunk/mozi
[email protected] ~/trunk/mozi $

Wer hätte das gedacht? Er wusste nie über popd/pushd. Ich denke wir sind sogar ...

45
Cory R. King

Lerne Vim.

Es ist (wohl) der beste Editor, aber mit Sicherheit der beste Editor, der auf einem nackten Linux-Server verfügbar ist.

41
Ali A

Es ist manchmal nützlich, ein Programm auch nach dem Abmelden laufen zu lassen. Ich habe einige Lösungen gesehen, die Nohup oder sogar Bildschirm für diesen Zweck verwenden. Das einfachste, das ich kenne, ist:

$ your_command_here & disown

Sie können auch ein laufendes Programm trennen:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
38
kyku

Wenn ich sicherstellen möchte, dass ich den tatsächlichen Befehl und keinen Alias ​​verwende, verwende ich einen führenden Backslash:

\rm -rf ~/tmp
38
mouviciel

Dieser Tipp macht Ihre CLI komfortabler (zumindest für mich):

erstellen Sie eine ~/.inputrc-Datei mit folgendem Inhalt:

"\e[A": history-search-backward
"\e[B": history-search-forward

Laden Sie bash neu (z. B. durch Eingabe von "exec bash"). Wenn Sie ein Präfix eines Befehls eingeben und den Aufwärtspfeil drücken, durchsuchen Sie Befehle, die mit Ihrem Präfix beginnen. Wenn Sie beispielsweise ssh eingegeben haben, werden Ihre früheren Verbindungen mit Remote-Shells angezeigt. Wenn Ihre Eingabeaufforderung leer ist, durchsucht der Aufwärtspfeil den Verlauf auf normale Weise.

38
kyku

Verwenden && Anstatt von ; bei gleichzeitiger Ausführung mehrerer Befehle. Es stoppt, wenn ein Fehler auftritt, und führt die anderen Befehle nicht aus.

Klassisches Beispiel:

./configure && make && make install
36
x-way

Wenn ich in bash Schleifen in die Befehlszeile schreibe, stelle ich riskanten Befehlen häufig den Befehl 'echo' voran.

for item in items; do echo something-risky; done

Auf diese Weise kann ich das "etwas Riskante" vollständig sehen, bevor ich mich dazu verpflichte, es auszuführen. Hilft, wenn Ihr riskanter Befehl variable Erweiterungen und Globs enthält. Und 'set -x' ist sehr nützlich beim Schreiben von Bash-Skripten.

'set -x' aktiviert das Debuggen. Informationen zum Bash-Debugging finden Sie unter http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html .

32
Jonathon Watney

Anforderung

Sie müssen die maximale Bandbreite zwischen 2 Servern testen.


Lösung

Ein SERVER1 do:

nc -u -l 54321 > /dev/null

Ein SERVER2 do:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Sie sehen folgende Ausgaben:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB/s ist hier der interessante Faktor, der die tatsächliche Netzwerkübertragungsbandbreite anzeigt.

Erklärung:

Wenn das Paket über das Netzwerk fließt, können Sie Bandbreitenstatistiken auf SERVER2 anzeigen. Dies ist eine ziemlich gute Schätzung der tatsächlich maximal möglichen Bandbreite zwischen den beiden Servern.

Kopieren per UDP (um TCP Overhead) zu vermeiden.

Kopieren in von Speicher (/ dev/zero) auf SERVER1 in Speicher (/ dev/null) auf SERVER2, wodurch verhindert wird, dass Festplatten-E/A zum Engpass werden.

31
Maxim Veksler

Das Anzeigen von Farbverzeichnisstrukturen ist einfacher.

alias ls="ls --color=tty"

Bearbeiten

alias ls="ls --color=auto"
23
Suroot

Einige kleine Hinweise zur Protokollanzeige:

  1. Sie können tail -F verwenden, um das Protokoll nach dem Abschneiden weiter zu überwachen (Beispiel log4j).
  2. Sie können weniger verwenden: Weniger öffnen, klicken Sie auf MSCHALT + F, um das Schwanzverhalten zu emulieren. Eine nützliche Kombination ist - S, um den Zeilenumbruch zu deaktivieren. Mit weniger können Sie in den Protokollen suchen.
20
Maxim Veksler

Ich habe vor langer Zeit einen Trick von einem Freund gelernt, um die Dateierweiterung einfach zu ändern:

mv my_filename.{old,new}

Die Shell-Erweiterung erweitert dies auf:

mv my_filename.old my_filename.new

Dies kann auch verwendet werden, um eine Datei auf andere Weise umzubenennen, z.

mv my_{,cool_}filename
20
Scotty Allen

Verwenden Sie "tar xf", um komprimierte Archive zu extrahieren. Das j für bzip2 und z für gzip sind nicht erforderlich, da tar den Dateityp Ihres Archivs erkennt. Weder steht '-' vor Argumenten. Sie sparen viel Zeit (über ein Jahrtausend ;-)).

Verwenden Sie besser noch nfoo , um ein Archiv mit einem einzigen Befehl ohne unnötige Argumente zu extrahieren.

19
kyku

Installieren Sie das Bash-Completion-Paket. Es enthält eine Reihe vordefinierter Abschlussregeln für Shell. Aktivieren Sie es, indem Sie "source/etc/bash_completion" eingeben, wenn Ihre Distribution dies nicht für Sie erledigt. Wenn Sie beispielsweise nach kpdf fertig sind, wird nur eine Liste von Verzeichnissen und PDF -Dateien) angezeigt. Es ist so intelligent, entfernte Dateien nach scp ssh: // server/XXX zu vervollständigen (if Sie haben passwortlose Anmeldungen aktiviert.

17
kyku

Ich benutze ständig diese

ALT-. (ESC +. In einigen Terminals) kopiert das zuletzt verwendete Argument (sehr nützlich)

STRG-W löscht Word

STRG-L Löschterminal (wie Löschbefehl, aber schneller)

ALT-B (ESC + B in einigen Terminals) bewegt ein Wort rückwärts

ALT-F (ESC + F in einigen Terminals) bewegt ein Wort vorwärts

STRG-E zu EOL springen

STRG-A Sprung zu BOL

STRG-R-Suche in der Geschichte

17
Álvaro

In Bash benutze ich ! $ viel. Es wiederholt das letzte Argument des letzten Befehls:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Es wird das ls ausführen. Wenn Sie es bearbeiten möchten, müssen Sie es nicht erneut eingeben. Verwenden Sie einfach! $. Dies ist sehr nützlich für lange Pfad-/Dateinamen. Außerdem wiederholt ! * Alle Argumente des vorherigen Befehls. Ich benutze das nicht so oft, aber es sieht nützlich aus.

Ich wusste, dass sie erwähnt wurden, aber ich benutze viel Vim, Bildschirm und CD.

Ich habe noclobber vergessen:

set -o noclobber

Von man bash :

Wenn diese Option aktiviert ist, überschreibt bash eine vorhandene Datei nicht mit den Umleitungsoperatoren>,> & und <>. Dies kann beim Erstellen von Ausgabedateien mit dem Umleitungsoperator> | überschrieben werden statt>.

16
gpojd

Wechseln Sie von bash zu zsh und sehen Sie, wie sich Ihre Produktivität verbessert:

  • Wirklich intelligente, skriptfähige Tab-Vervollständigung. Es vervollständigt nicht nur Befehlszeilen, sondern alle Optionen, Namen von Manpages, Paketnamen (für apt-get/emer usw.) und was Sie haben. Und bietet eine hilfreiche Erklärung der Optionen während der Fertigstellung. All dies ohne Verwendung eines Scrollback-Bereichs, nachdem der Befehl ausgegeben wurde.
  • Tab-Vervollständigung von Platzhaltern; Schreiben Sie cat * .txt, drücken Sie die Tabulatortaste und wählen Sie zwischen Dateien, die dem Ausdruck entsprechen.
  • Wechseln Sie die Verzeichnisse, indem Sie einfach ihre Namen eingeben.
  • Mehrere Zeileneditor-Modi. Kann sich wie vi oder emacs verhalten, wenn Sie es wollen.
  • Anpassbare Tastenkombinationen für beliebige Aufgaben.
  • Themable Eingabeaufforderungen, einschließlich der Möglichkeit, Eingabeaufforderungsinformationen auf der rechten Seite des Bildschirms einzufügen und beim Eingeben eines langen Befehls automatisch auszublenden

Google wird Ihnen viele weitere Vorteile bieten.

14
flodin

Alte Schule, Verschieben eines Verzeichnisbaums von einem Ort an einen anderen, Beibehalten von Symlinks, Berechtigungen und all den guten Dingen:

tar cBf - . | (cd /destination; tar xvBpf -)

oder über das Netzwerk

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Neue Schule:

rsync -urltv . /destination

oder über das Netzwerk

rsync -urltv -e ssh . foo.com:/destination
13
Paul Tomblin

Voraussetzung: Sie haben ein Verzeichnis mit einer großen Liste von Dateien, die Sie löschen möchten. rm -r wird scheitern!

Beispiel

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Lösung:

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Erklärung:

Bearbeiten: Erklärung nach @ ephemient Kommentar korrigieren.

find liefert rm Argumente mit den maximal zulässigen Argumenten. Auf diese Weise kann rm Dateien in Stapeln löschen. Dies ist die schnellste mir bekannte Technik, ohne die Operation -delete von find selbst zu verwenden. Es ist gleichbedeutend mit

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

dies ist möglicherweise hilfreich, wenn Ihr find-exec ... + nicht unterstützt.

13
Maxim Veksler

Ich benutze diese beiden Tipps so oft, dass ich dachte, es wäre eine gute Idee, sie zu teilen:

!foo

Startet den letzten Befehl in der Verlaufsdatei, der mit "foo" beginnt (ich verwende ihn häufig beim Kompilieren, !gcc beispielsweise.)

Die andere ist eine Tastenkombination (Strg + O anstelle von Zurück), mit der der Befehl ausgeführt UND der nächste Befehl in der Verlaufsdatei angezeigt wird. Wenn ich zum Beispiel eine Datei kompiliere und teste, mache ich immer 3 oder 4 Befehle, mache, CD in das Verzeichnis des Tests, führe den Test aus, CD in das Verzeichnis des Makefiles. Mit Strg + O macht dies diese Aufgabe viel einfacher :)

Ich hoffe das hilft!

11
claferri

Verwendung von Subversion unter Linux ohne die Hilfe ausgefallener grafischer Oberflächen, die möglicherweise nicht verfügbar sind.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Dies hält seltsamerweise viele Entwickler davon ab, Linux zu verwenden.

10
postfuturist

Am meisten übersehenes Kommando der alten Schule: find

Gestern habe ich einen groben Berechtigungsfehler behoben:

for u in nr dias simonpj; do
   Sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
10
Norman Ramsey

Bei Shells wie bash und ksh können Sie die Befehlszeile auf Navigationsbefehle wie Ihren Texteditor reagieren lassen:

set -o emacs

oder

set -o vi

mit dieser Option können Sie Ihren Verlauf durchsuchen und sich wie in Textdateien in der Befehlszeile bewegen (z. B. im vi-Modus, indem Sie ESC drücken und dann /string eingeben, wird Ihre vorherige durchsucht Befehle für "string" - Sie können n und N verwenden, um zwischen Übereinstimmungen zu wechseln.

8
Tim Whitcomb

grep ist mein Freund. Ernsthaft.

Listen Sie .rb Dateien auf, die den Text class foo Enthalten:

grep -l "class foo" .rb

Listen Sie .rb Dateien auf, die nicht den Text class foo Enthalten:

grep -L "class foo" *.rb

Listen Sie .rb Dateien auf, die nicht foo oder bar enthalten (Sie können jeden regulären Ausdruck mit -e verwenden, müssen sich jedoch den Operatoren entziehen):

grep -L -e "foo\|bar" *.rb
8
Sarah Mei

Die Shell-Substitution erfolgt mit ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory
8
Eugene Morozov

$_ Ist eine Umgebungsvariable für das letzte Argument des vorherigen Befehls

Also, wenn ich ein neues Verzeichnis erstelle

$ mkdir ~/newdir/

Um einzutreten, gehe ich einfach

$ cd $_

Dies ist praktisch für komplizierte und große Texte wie URLs, Verzeichnisse, lange Dateinamen usw.


Sie können auch mit !:{number} Auf jedes Argument im vorherigen Befehl verweisen.

$ echo !:0 !:1 !:2

Beachten Sie, dass bash dies erweitert, bevor Sie es ausführen (um dies zu sehen, drücken Sie nach oben, um Ihren Verlauf durchzugehen).

$ touch one two three
$ ls !:1 !:2 !:3 

Im Gegensatz zu $_, Einer Umgebungsvariablen, wird diese auf 'ls eins zwei drei' erweitert, die Aktion ausgeführt und der Befehl an die Shell gedruckt. Diese Methode ist (meiner Meinung nach) viel schwieriger anzuwenden als $_, Die ich viel häufiger verwende.

Hinweis: Sie können auch! $ Anstelle von $ _ verwenden, ersteres wird jedoch erweitert.

7
Nick Devereaux

Es gab eine Antwort zur Verwendung von pushd/popd Zum Speichern von Verzeichnissen. Wenn Sie vorübergehend ein Verzeichnis besuchen möchten, können Sie die Eingabe mit dem Befehl cd - Speichern, wie folgt:

/home/eugene $ cd /etc
/etc $ cd -
/home/eugene $

Einer meiner Lieblingsbefehle ist xargs. Ich benutze es sehr oft mit find, aber es kann auch in anderen Situationen nützlich sein. Um beispielsweise herauszufinden, welche Befehlszeilenargumente zum Starten eines Prozesses verwendet wurden, können Sie den folgenden Befehl unter Linux verwenden:

 $ xargs -0 echo < /proc/[PID]/cmdline

In einigen Fällen (insbesondere beim Arbeiten mit Quellcode) ack ist praktischer als grep, da es automatisch rekursiv sucht und Sicherungsdateien und Versionskontrollverzeichnisse (wie .svn, .hg) ignoriert. . Keine langen Befehlszeilen wie find . -name \*.c | xargs grep 'frobnicate' Eingeben.

6
Eugene Morozov

Eine schöne, die ich heute von einem Freund gesehen habe.

Bereinigen Sie das Protokoll der Anwendung (für den nächsten Start und Co.)

> /var/log/appname.log

(Beachten Sie, dass > Teil des Befehls ist).

Dies ist dasselbe wie:

echo '' > /var/log/appname.log
6
Maxim Veksler

hier ist eine exzellente Sammlung von Tipps, die mir heute bei digg begegnet sind.

5
Satish

Ich habe gerade Linux-Tipps gelesen, die jeder Geek kennen sollte bei TuxRadar. Sehr schöne Artikel für diejenigen, die ein wenig wissen, aber mehr wissen wollen.

5
matpie

cut und grep sind eine sehr gute Möglichkeit, einfache Textdateien zu verwalten. Sie können alles abrufen, was Sie wollen. cut ermöglicht es Ihnen, die Datei "vertikal" zu teilen, und grep ermöglicht es Ihnen, die Datei "horizontal" zu teilen.

Der folgende Satz teilt alle Zeilen für ; an gibt nur die 1 und 3 zurück.

$cut -d ';' -f 1,3 hello.txt

Mit grep (einem bekannten Befehl) können Sie dasselbe für Zeilen tun. Der folgende Satz ignoriert die Zeilen, die für Sie kein Interesse haben:

$grep error hello.txt

grep kann auch umgekehrt sein: Ignorieren Sie Zeilen, die nicht zum Muster passen, und Sie können auch reguläre Ausdrücke verwenden.

Aber die mächtigste von beiden verwendet Rohre. Zum Beispiel:

$grep error hello.txt | cut d ':' -f1,3 | cut -d' ' -f1
5
FerranB

Wenn Sie sowohl stdout als auch stderr in einer Umleitung kombinieren möchten, verwenden Sie 2>&1, wie in:

make > make.log 2>&1

4
Jared Oberhaus

Mein ISP hat eine Bandbreitenbeschränkung, aber ein Fenster, in dem alle um 2 oder 3 Uhr morgens beginnen können. Also plane ich große Downloads für dieses Fenster mit at:

$ echo aptitude -d -y dist-upgrade | at 3am
$ echo wget http://example.com/bigfile | at 3am

Das, was mich ursprünglich mit at verwechselt hat, ist, dass das Skript auf stdin und nicht auf der Befehlszeile verwendet wird.

4
bstpierre

Verwenden Sie den Befehl watch, um Befehle zu wiederholen und Ergebnisse zu beobachten. Wenn es nicht unterstützt wird (wie auf Solaris-Systemen), versuchen Sie Folgendes (Bash):

while [ 1 ] ; do
<cmd>
sleep <n> # n is # of seconds to repeat command
echo "" # meaningful output here can be helpful
        # I like to use ">>>>>>" `date` "<<<<<<<"
done
4
bedwyr
reset

oder

stty sane

für den Fall, dass Sie Ihr Terminal durch versehentliches Catten einer Binärdatei ruinieren!

4
dogbane

Sie können mehr als einer Datei mit tail -f Folgen:

tail -f logfile1 logfile2

die Aktualisierungen werden je nach Reihenfolge des Auftretens miteinander vermischt:

==> logfile1 <==
event-a
event-b
==> logfile2 <==
event-p
event-q
==> logfile1 <==
event-c

Wenn Sie eine sauberere Anzeige wünschen, verwenden Sie watch und lassen Sie den -f In tail weg:

watch tail logfile1 logfile2

Mein persönlicher Favorit aller Zeiten: CLI-Meta und persistente Aliase .

mit diesen Aliasen ein einfacher Befehl (val), um neue Shell-Aliase zu definieren und sie vorwärts zu bringen. Das Konzept kann durch zusätzliche Aliasdateien oder Aliase auf kleinere "Modi"/Domänen erweitert werden.

in ~/.alias.sh (stellen Sie sicher, dass dies in Ihren Shell-Startdateien enthalten ist)

# bash format example
alias sal='. ~/.alias.sh; echo ~/.alias.sh was sourced'
alias val='vi ~/.alias.sh; sal'

oder ~/.alias.csh ( csh format-- stellen Sie sicher, dass es in Ihre Shell-Startdateien aufgenommen wird)

# csh format 
alias sal 'source ~/.alias.csh; echo ~/.alias.csh was sourced'
alias val 'vi ~/.alias.csh ; sal'
3
popcnt

Meine häufigsten ls Befehle sind

ls -lSr
ls -ltr

dateien nach zunehmender Größe und Zeit sortieren (um die größten oder neuesten Dateien zu finden). Wenn Sie aus irgendeinem Grund kein Farbterminal haben oder keine Farben mögen (wie ich), dann ls -F gibt Ihnen die gleichen Metadaten wie Farben: '/' zeigt ein Verzeichnis an, '*' eine ausführbare Datei usw.

Lernen Sie auch, find und xargs zu verwenden: Die Leistung der Befehlszeile besteht darin, kleinere Befehle zu etwas Stärkerem zusammenzufügen. Diese 2 Befehle sind dafür unverzichtbar!

3
KarstenF

here-Docs machen Spaß:

cat << EOF > /tmp/file.txt

The ${speed} ${color} ${animal} jumped over the ${structure}

EOF

Oder, wenn Sie BASH verwenden .. Spaß mit here-docs in Schleifen:

cat << EOF > /tmp/file.txt

The ${speed[i]} ${color[i]} ${animal[i]} jumped over the ${structure[i]}

EOF

Praktisch zum Generieren von HTML, PHP, Konfigurationsdateien oder fast allem anderen in einem Shell-Skript. Sogar andere Shell-Skripte :)

3
Tim Post

Tastenkombinationen für die Befehlszeilenbearbeitung, die ich in Bash verwende:

STRG- - Löschen Sie den Text von der Cursorposition zurück nach Hause. Ideal, wenn Sie ein Passwort falsch eingeben und sich nicht daran erinnern, ob Ihr Terminal DELETE oder BACKSPACE unterstützt.

STRG-A - Genau wie die HOME-Taste, auch wenn Ihr Terminal HOME nicht richtig sendet.

STRG-E - Genau wie ENDE

ALT-F - Bewegen Sie den Cursor um ein Wort vorwärts.

ALT-B - Bewegen Sie den Cursor um ein Wort nach hinten.

3
Shalom Craimer

Ich bin überrascht, dass niemand den eingebauten Befehl fc von bash erwähnt hat (fc steht für Fix Command).

Verwenden Sie diese Option, um Ihren vorherigen Befehl in einem Editor (d. H. Vim) anstatt in der Befehlszeile zu bearbeiten und beim Beenden des Editors auszuführen. Ziemlich praktisch.

fc [-e ename] [-nlr] [first] [last]
fc -s [pat=rep] [command]

Lesen Sie mehr darüber hier

3
ArtBIT

Fügen Sie dies zu ~/.bashrc hinzu

# expand things like !310:1 after spaces.
bind Space:magic-space

Es ist ein bisschen beängstigend zu benutzen

  • !: 0 (0. Argument des letzten Befehls, d. H. Der Programmname)
  • !: 2 (2. Argument des letzten Befehls)
  • !! (das ganze letzte Kommando) (Sudo !!)
  • ! $ (letztes Argument des letzten Befehls)
  • ! * (alle Argumente des letzten Befehls)
  • ! ssh (letzter Befehl beginnend mit ssh)
  • ^ Chunky ^ Bacon (letzter Befehl außer dem ersten Chunky wird durch Bacon ersetzt)
  • !: gs\chunky\bacon (... alles klobige wird durch Speck ersetzt)

ohne zu überprüfen, was ersetzt wird, bevor der Befehl ausgeführt wird.

Wenn Sie Platzhalter wie * .txt oder Globs wie hallo. {Txt, org} verwenden, können Sie vorher überprüfen, was mit dem Befehl echo gemacht wird.

echo rm *.bak
rm *.bak

Aber für Sachen wie !: 0 verwenden Sie kein Echo, denn sobald das Echo fertig ist, ist der letzte Befehl der Echo-Befehl. Sie haben vielleicht von diesem Phänomen als dem Prinzip der "Beobachtungsschraube" in der Quantenmechanik gehört.

Stattdessen fügst du einfach "bind Space: magic-space" in dein ~/.bashrc ein und dann, wenn du die Leertaste drückst, werden die Dinge wie !: 0 genau dort erweitert.

3
RamyenHead

Suche in einer komprimierten Datei, ohne sie vorher zu entpacken :

gzcat someFile.gz | grep searchString
2
Millhouse

Einige nützliche:

rsync -av old_location new_location

kopiert eine Verzeichnisstruktur und behält Berechtigungen und Links bei.

Sudo updatedb && locate filename

um Dateien schnell zu finden (erfordert findutils)

apropos term_or_terms

durchsucht die Manpages.

2
rlbond
alias rm='rm -i'
2
VirtualDevil

Wenn Sie denken: "Oh, ich kann nur ungefähr 15 Zeilen Perl/Python/was auch immer schreiben, um das zu tun, was ich will", schauen Sie sich zuerst die coreutils an.

2
Svante

Sie können Pfadsubstitutionen durchführen, um Verzeichnisse zu ändern, indem Sie 2 Argumente mit cd verwenden:

$ pwd
/foo/bar/blah
$ cd bar bat
/foo/bat/blah
2
jpeacock

benutze erwarten! Dies erleichtert die Skripterstellung für interaktive Tools erheblich. Sie können beispielsweise eine Telnet-Sitzung oder eine FTP-Sitzung per Skript ausführen.

Arbeiten Sie in der Befehlszeile und schreiben Sie sie dann einfach per Skript. Hier ist ein grobes Beispiel: Telnet auf einem Entwicklungsboard, Abrufen eines Kernel-Images und Einfügen in Flash

#!/bin/bash
# scripted telnet
IP=$1
IMAGE="platform-AT91SAM9260/images/linuximage"
cp $IMAGE /home/cynove/public_html/
expect -b - <<EndOfTelnet
spawn telnet $IP
expect "login"
send "root\r"
expect "#"
set timeout -1
send "wget -O kimage http://192.168.10.2/~cynove/linuximage\r"
expect "#"
send "ls -al kimage\r"
expect "kimage"
send "flashcp -v kimage /dev/mtd1\r"
expect "Erasing"
expect "#"
send "exit\r"
EndOfTelnet
2
shodanex

Ich mag die folgenden Befehle, mit denen Sie Google und Google Bücher im Terminal erhalten

#!/bin/sh

q=$1
w=$2
e=$3
r=$4
t=$5

open "http://www.google.com/search?q=$q+$w+$e+$r+$t&ie=utf-8&oe=utf-8:en-GB:official&client=firefox-a"

und Google Bücher im Terminal

#!/bin/sh

q=$1
w=$2
e=$3
r=$4
t=$5

open "http://books.google.com/books?q=$q+$w+$e+$r+$t"

Ich habe folgendes in .bashrc

alias gb='/Users/Mas/bin/googlebooks'                                                                               

alias g='/Users/Mas/bin/google'

Ich habe die Berechtigungen 777 für die Skripte unter/bin/googleScripts /.

Beispiele

gb Strang null space            // searches books which have the words

g Lordi Hard Rock Eurovision   // Googles websites which have the words

Es wäre cool, Buchtitel im Terminal zu haben, damit Sie keinen externen Browser benötigen.

Ebenso wäre es nützlich, die URLs der Google-Suche direkt im Terminal zu haben, damit Sie die Daten im Terminal verarbeiten können.

Einer meiner Lieblings-Cli-Tricks ist es, aus der CLI auszusteigen.

xdg-open .

Dies öffnet einen GUI-Dateibrowser mit dem aktuellen Verzeichnis. Das ist für Linux. Verwenden Sie "START". für Windows und "öffnen". für OS X)

Bevor ich gelernt habe, Echo zu verwenden, hatte ich Angst, rm mit Platzhaltern zu verwenden, also habe ich den aktuellen Ordner xdg-geöffnet und dann Dateien in der GUI entfernt. Ich hatte auch Angst vor dem Befehl tar, einem weiteren Grund, xdg-open zu verwenden.

Was ist mit einem Weg zurück in die CLI-Welt?

Doppelklicken Sie (oder dreimal) auf die Speicherortleiste Ihres GUI-Dateibrowsers und führen Sie Folgendes aus:

cd "$(xsel)"

das ist von hier . (oder benutze open-terminal-here mit nautilus)

2
RamyenHead

Sicherheit an der Kommandozeile

Erfahrene Sysadmins tun Dinge, die zunächst faul oder eigenwillig erscheinen, aber ihren Speck einmal in einem blauen Mond aufbewahren.

Geben Sie nichts ein, was Sie einfügen können

Ziehen Sie das Kopieren und Einfügen der Eingabe vor, unabhängig davon, ob Sie aus einem Ausführungsbuch, einem Handbuch oder nur höher im Terminalfenster kopieren. Es ist allzu einfach, falsche Argumente, Schalter, Befehle, Dateinamen usw. einzugeben, insbesondere wenn Sie gleichzeitig Systeme betrachten, den Status einer Telefonkonferenz melden und versuchen, die Hauptursache eines Problems herauszufinden.

Das Einfügen der Befehlszeile ist eine gute Angewohnheit. Wir sollten es aktivieren, indem wir a) alles skriptfähig machen und b) Befehle in Handbücher anstatt in Screenshots einfügen.

Windows unterscheiden

"Ups, falsche Shell!" Berühmte letzte Worte. Finden Sie eine Möglichkeit, Fenster zu trennen, die sich in verschiedenen Umgebungen anmelden. Geben Sie Produktionsumgebungen eine andere Hintergrundfarbe oder stellen Sie sie auf einen anderen Monitor.

Vertraue dem Pfad nicht

Ein Oldie, aber Goodie, besteht darin, ein Shell-Skript namens "ls" in Ihrem Verzeichnis zu erstellen. Machen Sie es suid root, lassen Sie es eine suid root-Kopie von/bin/bash in einem eigenen versteckten Verzeichnis erstellen, löschen Sie sich dann selbst und führen Sie das echte/bin/ls aus. Alles was Sie dann tun müssen, ist einen naiven Administrator zu bekommen, der "ls -la" in Ihrem Verzeichnis ausführt und poof , Sie haben eine Root-Shell.

Echte Admins haben nie "." auf ihren Wegen, genau um diese Art von Schleichangriff zu vermeiden. Das solltest du auch nicht. Das Hinzufügen von "./" an der Vorderseite von ausführbaren Dateien in der Nähe ist eine gute Angewohnheit.

Dateien nicht verschieben. Kopieren, dann löschen

"mv oldname newname" ist gefährlich. Es können zwei Dateien gleichzeitig zerstört werden. Es ist besser, eine Sequenz zu machen. Kopieren Sie die Origin-Datei zum Ziel, prüfen Sie, ob sie in Ordnung ist, und löschen Sie das Original. Warten Sie noch besser, bis Sie mit dem gesamten Vorgang fertig sind, und entfernen Sie dann die Originaldatei. Besser noch, erstellen Sie eine sichere Kopie der Datei, die Sie ändern möchten. Ziel ist es, alles vollständig umkehrbar zu machen, damit Sie jederzeit zu einem bekannten Zustand zurückkehren können.

2
user9495

Manchmal müssen Sie während der Arbeit im Terminal eine Datei mit einer damit verbundenen GUI-Anwendung öffnen, z. B. für PDF- oder MP3-Dateien. Sie müssen sich nicht den genauen Namen dieses Befehls merken, sondern verwenden Sie einfach:

gnome-open some-file.pdf

Übrigens ist der kürzeste Alias, den ich benutze:

alias o=gnome-open

Sehr praktisch.

2
jackhab

Schnelle und einfache Überprüfung der Datenintegrität

mit nichts mehr als bash & md5sum

Dies kann sich im Hinblick auf das Debuggen von Problemen beim Verschieben von Binärdateien über das Netzwerk als unbezahlbar erweisen. Sie sollten diese Technik als gängige Praxis für jede Kopie wertvoller Daten anwenden, um eine 100% ige Datenintegrität sicherzustellen.

Richten Sie einige Testdaten ein ...

mkdir -p /tmp/mdTest/dir{1,2,3}
for i in `seq 1 3`; do echo $RANDOM > /tmp/mdTest/dir$i/file$i ; done

mD5-Hash-Berechnung für die Testdaten

cd /tmp/mdTest/
TMPMD5LIST=$(mktemp); (find  -type f -exec md5sum '{}' \;) > $TMPMD5LIST; mv $TMPMD5LIST list.md5sum

überprüfung der Datenintegration aus dem Hash

cd /tmp/mdTest/
md5sum --check list.md5sum
./dir3/file3: OK
./dir1/file1: OK
./dir2/file2: OK

Unit Test: Lassen Sie uns eine der Dateien brechen.

echo $RANDOM >> /tmp/mdTest/dir1/file1
md5sum --check list.md5sum
./dir3/file3: OK
./dir1/file1: FAILED
./dir2/file2: OK
md5sum: WARNING: 1 of 3 computed checksums did NOT match
2
Maxim Veksler

Bash-Parametererweiterungen sind großartig:

$ FOO=leading-trailing.txt

$ echo ${FOO#leading-} # remove leading match
trailing.txt

$ echo ${FOO%.txt} # remove trailing match
leading-trailing

$ echo ${FOO/-*/-following} # match a glob and substitute
leading-following.txt

Müssen Sie eine Reihe von Dateien umbenennen? Kombiniere mit einer for Schleife:

$ for FILE in file*.txt; do mv -v $FILE ${FILE#file-}; done
file-01.txt -> 01.txt
file-02.txt -> 02.txt
file-03.txt -> 03.txt

Sobald Sie ein grundlegendes Verständnis für sie haben, werden Sie überrascht sein, wie oft sie nützlich sind.

2
markdrayton

Mein Favorit und häufig verwendet:

Inhalt der tar.gz-Datei auflisten

tar -tzf filename.tar.gz

stimmt mit der Zeile überein, die S1 OR S2 OR S3 OR)) enthält S4

grep 'S1. * S2. * S3. * S4' Datei

Listet alle Unterverzeichnisse des aktuellen Verzeichnisses auf

ls -d * /

Gesamtgröße des Verzeichnisses
Du-sh

finde ein Datum:

TIMESTAMP = date '+%y%m%d%H%M'

Prozess vom Vordergrund in den Hintergrund verschieben

Strg-z und dann bg

Ganzes Wort in Großbuchstaben

echo "Wort" | awk '{print toupper ($ 0)}'

Überprüft die Gleichheit zwischen Zahlen

x -eq y Check ist x ist gleich y

x -ne y Überprüfen Sie, ob x nicht gleich y ist

x -gt y Überprüfen Sie, ob x größer als y ist

x -lt y Überprüfen Sie, ob x kleiner als y ist

Überprüft die Gleichheit zwischen Zeichenfolgen

x = y Überprüfen Sie, ob x mit y identisch ist

x! = y Überprüfen Sie, ob x nicht mit y identisch ist

-n x Wird als wahr ausgewertet, wenn x nicht null ist

-z x Wird als wahr ausgewertet, wenn x null ist

Befehlszeilenparameter für 'test'

-d prüft, ob die Datei ein Verzeichnis ist

-e Überprüfen Sie, ob die Datei vorhanden ist

-f Überprüfen Sie, ob die Datei eine reguläre Datei ist

-g prüft, ob die Datei SGID-Berechtigungen hat

-r prüft, ob die Datei lesbar ist

-s prüft, ob die Dateigröße nicht 0 ist

-u prüfe, ob die Datei SUID-Berechtigungen hat

-w prüft, ob die Datei beschreibbar ist

-x prüft, ob die Datei ausführbar ist

erstes Feld der letzten Zeile drucken "

awk '{field = $ 1}; END {Feld drucken} '

wichtige eingebaute Variablen

$ # Anzahl der Befehlszeilenargumente. Nützlich, um Nr. Zu testen. von Befehlszeilenargumenten im Shell-Skript.

$ * Alle Argumente für Shell

$ @ Wie oben

$ - Option an Shell geliefert

$$ PID der Shell

$! PID des zuletzt gestarteten Hintergrundprozesses (gestartet mit &)

1
Sasha

Ich gehe dazu über, niemals "rm" an einer Eingabeaufforderung einzugeben. Stattdessen gebe ich "ls" ein und wenn mir die Liste der entfernten Dateien gefällt, bearbeite ich den Befehl (leicht möglich mit bash und ksh).

Bearbeiten, um etwas aus den Kommentaren hinzuzufügen: "rm -i" fordert bei jedem Löschen dazu auf, den gleichen Zweck zu erfüllen. Vielen Dank!

1
David Thornley

Sie können eine einfache Vernetzung mit bash durchführen (Gutschrift für diese Seite und man bash):

cat < /dev/tcp/time.nist.gov/13

Ja, Schreiben und gleichzeitiges Lesen und Schreiben ist ebenfalls möglich.

1
kyku

Verstehen Sie vor allem alles, was Sie im Internet sehen, bevor Sie es in Ihrer Entwicklerbox ausprobieren.

1
DFectuoso

Hin und wieder keine von:

find . -exec ...
find . -print0 | xargs ...
for i in *.png; do ... done

funktioniert für die Verarbeitung einer Liste von Dateien, da man die kombinierte Suchkraft, NULL-getrennte Dateinamen sowie einfache Shell-Schleifen benötigt. Die Lösung ist dieses kleine Stück Bash-Code:

find . -print0 | while read -r -d $'\0' filename; do echo $filename; done

Dadurch kann man NULL-getrennte Dateien in einer normalen Schleife verarbeiten.

1
Grumbel

Shell-f ist ein Ort zum Speichern, Moderieren und Weitergeben von Befehlszeilentipps und -tricks. Ein bisschen wie StackOverflow, aber nur für Shell. Dort finden Sie viele Antworten auf diese Frage.

1

Ein weiterer Trick:

Wenn ich einen Bash-Alias ​​erstellen möchte, erstelle ich einfach ein Bash-Skript in meinem Benutzer-Bin-Ordner.

Anstatt beispielsweise die folgende Zeile zu meiner .bashrc hinzuzufügen,

alias make-symlink='ln -s -iv'

Ich würde das folgende Skript erstellen und es als ~/bin/make-symlink speichern

#!/bin/bash                                                                     
ln -s -iv "[email protected]"

Sobald das Skript ausführbar ist (chmod + x), habe ich einen neuen Alias.

Jetzt kann make-symlink in xargs verwendet werden. Auch wenn Sie eine andere Shell verwenden (ZSH, FISH, IPYTHON, ...), gibt es auch make-symlink.

Wenn Sie Emacs verwenden, möchten Sie möglicherweise Folgendes zu Ihrer Emacs-Init-Datei hinzufügen.

;; Make scripts executable on save                                              
(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
1
RamyenHead

Der Befehl 'tee' ist sehr nützlich, wenn Sie in eine Datei ausgeben und gleichzeitig den Fortschritt sehen möchten. Dies ist besonders hilfreich, wenn Sie die Ausgabe in einer Datei protokollieren und diese im weiteren Verlauf beobachten müssen.

Anstatt etwas zu tun wie:

./program > file &
tail -f file

Sie können den Befehl tee in einer Zeile verwenden:

./program | tee file
1
Jeff Billimek

Ich fand die Git-Versionskontrolle wie folgt:

  • Bissig
  • Ein Vergnügen zu benutzen
  • Nützlich für Projekte fast jeder Größe (100K bis 100GB; 1 bis 100k Dateien)

So mache ich das:

# Create new repository
# (for now, it will live in .git/ - a single directory)
git init

# Commit all I got so far
git add .
git commit

# Add new or modified files manually
git add *.c
git status
git commit

# Add all modified files
git status
git commit -a

# Redo last commit
git commit -a --amend

# View log
git log

# Reset everything (files and git history) back to 
# what it was at 96223554b3e3b787270b1f216c19ae38e6f83ca5
git branch this-was-a-mistake
git reset --hard 9622

# Everything is back in time
ls
git log
1

Einfache Summen/Durchschnittswerte/Gruppierung mit awk:

cat tests
ABC 50
DEF 70
XYZ 20
DEF 100
MNP 60
ABC 30

cat tests | awk '{sums[$1] += $2; tot += $2; qty++}\
   END { for (i in sums) 
     printf("%s %s\n", i, sums[i]); 
     printf("Total: %d\nAverage: %0.2f\n", tot, tot/qty)} ' 
MNP 60
ABC 80
XYZ 20
DEF 170
Total: 330
Average: 55.00
1
ggiroux

Ich weiß nicht, dass diese Befehle in der obigen Liste stehen ... !!!

  1. finden . -name .svn -typ d | xargs rm -rf

    Entfernen Sie alle .svn-Ordner

  2. bash -x script.sh

    zeile drucken und in BASH ausführen

  3. Strg + [

    das gleiche wie [Esc] in vim

  4. shopt -s autocd

    Automatisch CD ins Verzeichnis

  5. df -i

    Zeigen Sie die aktuelle Anzahl freier/verwendeter Inodes in einem Dateisystem an

  6. Sudo !!

    Führen Sie den letzten Befehl als root aus

  7. python -m SimpleHTTPServer

    Stellen Sie den aktuellen Verzeichnisbaum unter http: // $ HOSTNAME: 8000/bereit

  8. netstat -tlnp

    Listet alle Überwachungsports zusammen mit der PID des zugeordneten Prozesses auf

  9. Im Folgenden finden Sie einige Möglichkeiten, um input.txt zu nummerieren:

    katze -n

    $ cat -n input.txt 1 123 2 3 456 4 5 789 6 7 8 abc 9 10 def 11 12 ghi

1
Jayakrishnan T
  • Für kleinere Verzeichnisbäume mit zu durchsuchender Dokumentation

    find .
    
  • So leeren Sie eine Datei aus Shell

    > file.txt
    
  • Um zu meinem Home-Verzeichnis zurückzukehren

    cd
    
1
Dlf

Ich verfolge gerne alles, was ich tue. Ein Befehl, den ich im College gelernt habe, war "Skript". Dadurch werden alle Ausgaben auf Ihrem Terminal übernommen und in einer Datei protokolliert. Was ich nicht im College gelernt habe, ist, wie man jedes Terminal zu einem Skript macht. Jetzt habe ich dies in meiner .login-Datei:

exec script ~/.TypeScript/`date +%Y%m%d%H%M%S`.$$

Stellen Sie sicher, dass ~/.TypeScript/vorhanden ist, bevor Sie dies am Ende Ihrer .login-Datei hinzufügen. :) :)

1
toppledwagon

IMHO, * nix wichtigster Befehl aller Zeiten ist ... Mann :)

Fast alles, was man wissen muss, kann beim Menschen gefunden werden, und die Verwendung des Menschen hindert uns daran, unsere Mitarbeiter zu unterbrechen. Und der Umgang mit Unterbrechungen ist eines unserer größten Probleme ...

1
Marco Ramos

STRG +] x, um die Suche nach einem Zeichen "x" weiterzuleiten, und Meta, STRG +] x, um die Suche rückwärts durchzuführen. Auf den meisten Systemen kann Meta ESC oder ALT sein. Bei ESC drücken Sie ESC und lassen dann los, kombinieren dann STRG und] und drücken dann das zu suchende Zeichen. Drücken Sie für ALT gleichzeitig STRG + ALT +] und dann das Zielzeichen.

Ich finde es nützlich, wenn Sie den Verlaufsbefehl bearbeiten.

Für sehr lange und sehr komplizierte Befehle. Ich benutze fc, um vi zu öffnen (wahrscheinlich tatsächlich vim unter Linux), um den Befehl zu bearbeiten.

0
zhaorufei

Ausgabeumleitung. Wenn Sie etwas ausführen, hängen Sie es an

um die Ausgabe für später zu erfassen. Anhängen

> & error_and_log.text

for errors as well.

0
PaulHurleyuk

pushd und popd, um vorübergehend zu verschiedenen Verzeichnissen zu wechseln.

Damit

pushd ~/tmp

sie werden in dieses Verzeichnis verschoben, aber Ihren aktuellen Speicherort auf einen Stapel verschieben (damit er verschachtelt werden kann).

Dann

popd

um zum vorherigen Ort zurückzukehren.

0
Unsliced

Aktivieren Sie den Inline-Modus für die Tab-Vervollständigung von Bash:

http://codesnippets.joyent.com/posts/show/169

0
bitshift

So öffnen Sie die Remote X-Anwendung auf Ihrem lokalen Computer:

ssh -X [email protected]
konsole

Auf diese Weise können Sie schnell grafische Anwendungen anzeigen, die auf einem Remote-Host ausgeführt werden und Ihren Computer dennoch als grafischen Server verwenden.

0
Maxim Veksler

Ausgewählten Text kopieren:

CTRL + SHIFT + C

... und einfügen:

CTRL + SHIFT + V
0

In Bash zum Schließen von Dateideskriptoren: FD> & -

Schließen stderr:

$ function echostderr() { echo $1 >&2; }
$ echostderr "now you see me"
now you see me
$ echostderr "now you don't" 2>&-
$ 

Oder in einem Skript:

$ function echostderr() { exec 2>&-; echo $1 >&2; }
$ echostderr "now you don't"
$ 
0
aless

Um mehrere Dateien auf ähnliche Weise umzubenennen, fand ich das folgende Skript im Laufe der Jahre sehr nützlich und robust.

Es gibt nur die Ausgabe von ls in Ihren bevorzugten Texteditor ein. Sie ändern einfach den Text, speichern, schließen. Die Dateien werden entsprechend umbenannt.

Es ist besonders gut, wenn Sie dies mit der Bearbeitung von Vi-Spalten kombinieren (Ctrl-v, wählen Sie einen Block aus, I, der vor oder A eingefügt werden soll, geben Sie Text ein, Esc).

#!/usr/bin/Ruby

RM = '/bin/rm'
MV = '/bin/mv'

from = Dir.entries('.').sort; from.delete('.'); from.delete('..')
from.sort!

from.delete_if {|i| i =~ /^\./} # Hidden files

tmp = "/tmp/renamer.#{Time.now.to_i}.#{(Rand * 1000).to_i}"

File.open(tmp, 'w') do |f|
  from.each {|i| f.puts i}
end

ENV['EDITOR'] = 'vi' if ENV['EDITOR'].nil?
system("#{ENV['EDITOR']} #{tmp}")

to = File.open(tmp) {|f| f.readlines.collect{|l| l.chomp}}
`#{RM} #{tmp}`

if to.size != from.size
  STDERR.puts "renamer: ERROR: number of lines changed"
  exit(1)
end

from.each_with_index do |f, i|
  puts `#{MV} -v --interactive "#{f}" "#{to[i]}"` unless f == to[i]
end

Ich nenne dieses Skript renamer.

0

Hier finden Sie eine Sammlung von Linux- und UNIX-Benutzerverwaltungsbefehlen http://www.linuxconfig.net/2009/11/16/linux-unix-user-management-commands.html

0
linuxconfig.net

Um einen Teil eines Dateisystems auf eine neue Festplatte zu kopieren, kann man verwenden

mkfs.ext4 /dev/sdb
mkdir /mnt/newhd
mount /dev/sdb /mnt/newhd/
rsync -av --hard-links --acls --one-file-system --xattrs /home/maxim/ /mnt/newhd/
echo '/dev/sdb /home/maxim ext4 defaults,user_xattr,noatime 0 1' >> /etc/fstab
0
Maxim Veksler

Meta +. in bash zum Durchlaufen des letzten Arguments aus vorherigen Befehlen. Ideal zum Laufen von Schwanz und Grep in verschiedenen Kombinationen.

0
Jeremy M

Starten Sie einen Befehl oder eine Pipeline IMMER mit # (Kommentar) und entfernen Sie ihn, wenn Sie mit dem Schreiben des Befehls fertig sind. Gibt dir eine 2. Chance, rm -rf/like Dinge zu entdecken.

0
user23312