2009-06-08 13 views
15

Wir hatten diese für viele andere Sprachen. Der für C/C++ war sehr beliebt, so war das Äquivalent für Python. Ich dachte, eine für BASH wäre auch interessant.Nützliche BASH Code Schnipsel

+4

Dies sollte Gemeinschaft Wiki –

+1

Vielen Dank für den Hinweis! Jetzt ist es. –

+1

Ich benutze '$ python' sehr viel. –

Antwort

0

Um alle Dateien in ~, die von der Gruppe etwas vboxusers werden, habe ich stattdessen von der Benutzergruppe kent Eigentum im Besitz zu ändern. Aber wie es hatte eine Schwäche bei der Verwendung xargs ich es auf die vorgeschlagene Lösung im Kommentar zu dieser Antwort bin zu ändern:

$ find ~ -group vboxusers -exec chown kent:kent {} \; 
+1

Der richtige Weg ist: find ~ -group vboxusers -exec chown kent: kent {} \; – Neil

+0

Wenn Sie mehr als 4096 Ergebnisse haben, wird Ihr Skript mit XARGs fehlschlagen. – Neil

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Ich habe die obige Lösung auf Ihre geändert. –

11

G'day,

Mein Favorit, und es ist auf andere Schalen anwendbar, die Aliase unterstützen, ist die einfache Möglichkeit, einen Alias ​​vorübergehend zu deaktivieren, indem sie einen Backslash auf einen Befehl vorangestellt wird.

So:

alias rm='rm -i' 

würden Sie immer geben interaktiven Modus, wenn rm Eingabe Eingabe

\rm 

auf der Kommandozeile umgeht den Alias.

HTH

prost,

+0

ziemlich wichtig. Sie können es immer überschreiben, indem Sie rm -f –

+0

@Chris verwenden, yep. Ich wollte mehr zeigen, wie Alias-Befehle temporär deaktiviert werden. (-: –

6

Das ist nicht so nützlich, aber wirklich interessant:

history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -n | tail | sort -nr 

Es druckt die 10 am häufigsten verwendeten Befehle.

EDIT: Diese Frage ist wirklich ähnlich zu this.

1

Wir entwickeln Websites und speichern Code für sie in SVN. Bei der Umstellung auf Produktion möchten wir nicht, dass die .svn-Verzeichnisse angezeigt werden. Der folgende Code rekursiert Verzeichnisse und entfernt unerwünschte (könnte für alle unerwünschten Verzeichnisse verwendet werden). Nicht streng, aber trotzdem nützlich.

find . -type d -name .svn | xargs rm -rf 

Ausführung von der obersten Pfad im Produkt ... natürlich vorsichtig sein, wie an der falschen Stelle ausgeführt könnte sehr schlimme Dinge passieren.

Sie könnten auch durch eine Änderung vom Typ d -Typ f

+3

für svn gibt es auch 'svn export', das das Arbeitsverzeichnis exportiert und die .svn-Ordner unverändert lässt. – knittl

+2

Die korrekte Methode ist: find. -type d -name .svn -exec rm -rf {} \; – Neil

+0

Wenn Sie mehr als 4096 Ergebnisse haben, schlägt Ihr Skript mit XARGs fehl – Neil

14

In einem BASH-Skript eine normale Datei tun, um ein Argument zu Variablen zuweisen, sondern eine Standard bieten, wenn es vorhanden ist:

MYVAR=${1:-default} 

$ MYVAR wird das erste Argument enthalten, wenn man sonst "default" erhalten hat.

+1

Ganz zu schweigen von der Cousine dieses Snippets: MYVAR = $ {OTHER_VAR: = default}, die den Wert von OTHER_VAR auf den Standardwert setzt, wenn es nicht gesetzt ist. Oben verwendet nur die Standardeinstellung verwendet nur den Standardwert in dieser Instanz und lässt $ 1 unset. –

2

Zum Entfernen von .svn-Verzeichnissen können Sie auch die Kombination 'find ...- prune ...- exec ... verwenden.'(Ohne xargs):

# tested on Mac OS X 

find -x -E . \(-type d -regex '.*/\.svn/*.*' -prune \) -ls # test 

find -x -E . \(-type d -regex '.*/\.svn/*.*' -prune \) -exec /bin/rm -PRfv '{}' \; 
+1

Funktioniert nicht in Linux. – Neil

+1

Ich denke, Sie brauchen nicht "-exec rm" für gnu-find, da gibt es eine -Delete (aber nicht sicher über -PRfv: = verbose, force, Recursive, P?). Und Sie müssen '{}' nicht maskieren - sonst würde ich gerne upvote und akzeptiere es eine Antwort hier: http: // unix. stackexchange.com/q/8647/4485 –

18

Es gibt cd - zu dem zuvor besuchten Verzeichnis zu gehen:

/usr/local/bin> cd /i/am/a/banana 
/i/am/a/banana> cd - 
/usr/local/bin> 

... und dann gibt es all diese nützlichen Inkarnationen der BASH for-Schleife:

for file in *.txt; do ls $file; done 

for item in $(echo foo bar baz); do echo $item; done 

for num in {0..9}; do echo $num; done 
+2

Ich wusste nie von 'cd -', danke! Das sieht so aus, als könnte es helfen. – Zifre

+2

ick ... Ich hasse es immer 'seq i j' und' jot j i' zu sehen. Moderne Bash hat Bereichserweiterungen: für n in {1..100}; do ... – guns

+2

Warum haben Sie ein Verzeichnis namens/i/am/a/banana? ;) –

5

eine lange Zeit, das irgendwo auf dem Netz vor gefunden:

function bashtips { 
cat <<EOF 
DIRECTORIES 
----------- 
~-  Previous working directory 
pushd tmp Push tmp && cd tmp 
popd  Pop && cd 

GLOBBING AND OUTPUT SUBSTITUTION 
-------------------------------- 
ls a[b-dx]e Globs abe, ace, ade, axe 
ls a{c,bl}e Globs ace, able 
\$(ls)  \`ls\` (but nestable!) 

HISTORY MANIPULATION 
-------------------- 
!!  Last command 
!?foo  Last command containing \`foo' 
^foo^bar^ Last command containing \`foo', but substitute \`bar' 
!!:0  Last command word 
!!:^  Last command's first argument 
!\$  Last command's last argument 
!!:*  Last command's arguments 
!!:x-y  Arguments x to y of last command 
C-s  search forwards in history 
C-r  search backwards in history 

LINE EDITING 
------------ 
M-d  kill to end of word 
C-w  kill to beginning of word 
C-k  kill to end of line 
C-u  kill to beginning of line 
M-r  revert all modifications to current line 
C-]  search forwards in line 
M-C-]  search backwards in line 
C-t  transpose characters 
M-t  transpose words 
M-u  uppercase word 
M-l  lowercase word 
M-c  capitalize word 

COMPLETION 
---------- 
M-/  complete filename 
M-~  complete user name 
[email protected]  complete host name 
M-\$  complete variable name 
M-!  complete command name 
M-^  complete history 
EOF 
} 
3

Fügen Sie ein Leerzeichen (oder ein anderes Trennzeichen) nur hinzu, wenn eine Variable festgelegt ist, um unschöne unnötige Leerzeichen zu vermeiden.

$ first=Joe 
$ last=  # last name blank, the following echoes a space before the period 
$ echo "Hello, $first $last. Welcome to..." 
Hello, Joe . Welcome to... 

$ echo "Hello, $first${last:+ $last}. Welcome to..." 
Hello, Joe. Welcome to... 

$ last=Green 
$ echo "Hello, $first${last:+ $last}. Welcome to..." 
Hello, Joe Green. Welcome to... 
0
: > truncate-file-to-zero-bytes.txt # without changing its permissions 

See: codesnippets.joyent.com/posts/show/2067

2

Hier ist ein anderes:

#!/bin/bash 

# Shows the full path of files, good for copy pasting and for when 
# listing the full paths is necessary. 

# Usage: Run in the working directory (no path), otherwise takes the 
# same file specification as ls. 

for file in $(ls "[email protected]"); do 
     echo -n $(pwd) 
     [[ $(pwd) != "/" ]] && echo -n/
     echo $file 
done 
+3

Kürzere: 'readlink -f somefile' – Graham

2

Am Anfang eines Skripts, das als ausgeführt werden müssen, root:

if [ `id -u` != 0 ]; then 
    echo "This script must be run as root" 1>&2 
    exit 1 
fi 
+0

Nice one! Ich habe mich gefragt, wie man root aus einem Skript erkennt. :-) –

+1

Das '! = 0' ist überflüssig, und es kann zu 'test $ (id -u) && echo" Dies ... "&& exit 1' verkürzt werden –

+0

@userunknown: Diese Zeile macht keinen Sinn. Wird die 'id -u' nicht mit der Benutzer-ID antworten, und unabhängig davon einen Exit-Status von 0 haben, es sei denn, du verwendest eine root-ID von 0 als Status irgendwie ... das ist die 1> & 2 ... in diesem interessanter Fall ... Ich überprüfe das – TechZilla

0

Ich benutze dies, um Quellcode von f einrücken unsere Räume und kopieren Sie das Ergebnis in die Zwischenablage in X:

cat src/Something.java | sed -e 's/^/ /g' | xsel 

Jetzt Something.java ist bereit, durch mittlere Maustaste eingefügt werden. Ich weiß, ich kann den Ausdruck um eine Pipe reduzieren und die Katze entfernen, aber ich mag es auf diese Weise, weil ich es leichter finde, den Anfang zu bearbeiten, wenn ich den Ausdruck wiederverwende.

0

Eine effektive (und intuitive) Möglichkeit, einen vollständigen kanonischen Dateipfad für eine bestimmte Datei zu erhalten. Dies würde alle Fälle von symbolischen Links, relativer Dateireferenzen beheben, usw.

full_path="$(cd $(/usr/bin/dirname "$file"); pwd -P)/$(/usr/bin/basename "$file")" 
1

ich diese viel in Verbindung verwenden, um mit Java-Entwicklung:

 
#!/bin/sh 

if [ "$1" == "" ] || [ "$2" == "" ]; then 
echo "Usage jarfinder.sh " 
    exit 
fi 

SEARCH=`echo $2 | sed -e 's/[\\\/]/./g'` 

echo Searching jars and zips in $1 for "$SEARCH" 

find $1 -type f -printf "'%p'\n" | egrep "\.(jar|zip)'$" | sed -e "s/\(.*\)/echo \1 ; jar tvf \1 | sed -e 's\/^\/ \/' | grep -i \"$SEARCH\"/" | sh 

, die ich in meinem collection of handy scripts halten.

ich auch diesen Einzeiler viel nutzen:

find . -name "*.java" | xargs grep -li "yadayada" 

Ende dieses:

find . -name "*.java" | sed -e 's+\(.*\)+echo \1 ; yada_cmd \1+' | sh 
2

Hier ist ein schöner grep Ausdruck Leerzeilen und Kommentarzeilen zu entfernen:

grep -v '^[ \t]*$\|^[ \t]*#' /etc/ssh/sshd_config 

Das obige zeigt die verwendeten Einstellungen in sshd_config ohne Unordnung.

0

Ich benutze dies, um Anwendungen in ihrem eigenen Xterm-Fenster (oder nicht) von der gleichen Verbindung zu starten.

#!/bin/bash 
# 
# cli_app launcher -- detects where u are launching from; gui/tty 
# 

dev=`/usr/bin/tty` 
case $dev in 
/dev/pts/0 | /dev/pts/1) xterm -e /home/user/bin/cli_app ;; ## opens gui terminal 
*) /home/user/bin/cli_app ;;         ## opens where u are 
esac 

# eof # 
1
!find:p ......... show last find command - not execute 
# create one dir and go to 
echo 'mkcd() { mkdir -p "[email protected]" && cd $_; }' >> ~/.bashrc 

# backup file in single command 
cp /path/too/long/to/file{,.backup} 
1

Wenn Sie Ihr aktuelles Arbeitsverzeichnis in Ihrer Aufforderung haben ($PS1) werden in einem Terminal mit nur 80 Spalten laufen, und manchmal in wirklich tiefen Hierarchien arbeiten, können Sie mit einem Ende Eingabeaufforderung, die bis auf 5 Zeichen Ihrer Zeile dauert. In diesem Fall sind die folgenden Erklärungen hilfreich:

PS1='${PWD##$PREFIX}$ ' 

PREFIX='' export PREFIX 
prefix() { 
    PREFIX="$1" 
} 
prefix '*/' 

Der prefix '*/' Anruf Ihre prompte gesetzt wird nur das letzte Verzeichnis Element Ihrer aktuellen Arbeitsverzeichnis (statt den vollständigen Pfad) enthalten. Wenn Sie den gesamten Pfad anzeigen möchten, rufen Sie prefix ohne Argumente auf.

1

Ich liebe den Backtick-Operator.

gcc `pkg-config <package> --cflags` -o foo.o -c foo.c 

Und:

hd `whereis -b ls | sed "s/ls: //"` | head 

Wissen Sie, ich habe eine effizientere Art und Weise von ‚head'ing die hexdump eines binären verpasst, die Sie nicht wissen, die Lage von ... oh und als ziemlich offensichtlich ist, „ls“ mit einer variablen ausgelagert werden kann, um in einem Skript würde es so etwas wie gehen:

#!/bin/bash 
hd `whereis -b $1 | sed "s/$1: //"` | head 

der praktische Nutzen der oben ist ziemlich begrenzt, aber es zeigt die Vielseitigkeit der Backtick operiert oder (und die Bash Shell) ziemlich gut, meiner bescheidenen Meinung nach.