Hide

What's this?

commandlinefu.com is the place to record those command-line gems that you return to again and again.

Delete that bloated snippets file you've been using and share your personal repository with the world. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down.


If you have a new feature suggestion or find a bug, please get in touch via http://commandlinefu.uservoice.com/

Get involved!

You can sign-in using OpenID credentials, or register a traditional username and password.

First-time OpenID users will be automatically assigned a username which can be changed after signing in.

World cup college
Hide

Stay in the loop…

Follow the Tweets.

Every new command is wrapped in a tweet and posted to Twitter. Following the stream is a great way of staying abreast of the latest commands. For the more discerning, there are Twitter accounts for commands that get a minimum of 3 and 10 votes - that way only the great commands get tweeted.

» http://twitter.com/commandlinefu
» http://twitter.com/commandlinefu3
» http://twitter.com/commandlinefu10

Subscribe to the feeds.

Use your favourite RSS aggregator to stay in touch with the latest commands. There are feeds mirroring the 3 Twitter streams as well as for virtually every other subset (users, tags, functions,…):

Subscribe to the feed for:

Hide

News

2010-03-18 - Top 10 commands explained
There's a great article by Peteris Krumins explaining the current top 10 commands: http://www.catonmat.net/blog/top-ten-one-liners-from-commandlinefu-explained/
2010-03-03 - Commandlinefu @ SXSW 2010
Am going to be at SXSW this year, in case you want to submit any CLI nuggets or suggestions to me in person. Ping me on the @codeinthehole Twitter account.
2009-09-12 - Email updates now available
You can now enable email updates to let you know each time you're command is commented on.
2009-07-11 - API and javascript blog widget now available
A simple API has been released, allowing commands to be retrieved in various formats. This also allows commands to be embedded on blogs/homepages.
Hide

Tags

Hide

Functions

Commands tagged bash

Commands tagged bash from sorted by
Terminal - Commands tagged bash - 316 results
eog `curl -s http://xkcd.com/ | sed -n 's/<h3>Image URL.*: \(.*\)<\/h3>/\1/p'`
export PROMPT_COMMAND='if (($? > 0)); then echo -ne "\033[1;31m"; fi'; export PS1='[\[\]\u\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\]]\$ '
2010-08-25 21:19:30
User: quintic
Functions: echo export
1

If the return code from the last command was greater than zero, colour part of your prompt red. The commands give a prompt like this:

[user current_directory]$

After an error, the "[user" part is automatically coloured red.

Tested using bash on xterm and terminal. Place in your .bashrc or .bash_profile.

xdg-open http://xkcd.com/
2010-08-25 19:14:11
-3

KISS

To get a random xkcd comic:

xdg-open http://dynamic.xkcd.com/random/comic/
xkcd() { wget -qO- http://xkcd.com/ | sed -n 's#^<img src="\(http://imgs.[^"]\+\)"\s\+title="\(.\+\?\)"\salt.\+$#eog "\1"\necho '"'\2'#p" | bash ; }
2010-08-25 15:44:31
User: John_W
Functions: bash sed wget
0

This function displays the latest comic from xkcd.com. One of the best things about xkcd is the title text when you hover over the comic, so this function also displays that after you close the comic.

To get a random xkcd comic use the following:

xkcdrandom() { wget -qO- http://dynamic.xkcd.com/comic/random | sed -n 's#^<img src="\(http://imgs.[^"]\+\)"\s\+title="\(.\+\?\)"\salt.\+$#eog "\1"\necho '"'\2'#p" | bash; }

These are just a bit shorter than the ones eigthmillion wrote, however his version didn't work as expected on my laptop for some reason (I got the title-tag first), so these build a command which is executed by bash.

eog `curl 'http://xkcd.com/' | awk -F "ng): |</h" '/embedding/{print $2}'`
gwenview `wget -O - http://xkcd.com/ | grep 'png' | grep '<img src="http://imgs.xkcd.com/comics/' | sed s/title=\".*//g | sed 's/.png\"/.png/g' | sed 's/<img src=\"//g'`
2010-08-24 22:21:51
User: hunterm
Functions: grep sed
0

Output the html from xkcd's index.html, filter out the html tags, and then view it in gwenview.

rename 's/foo/bar/g' foobar
2010-08-19 03:33:13
Functions: rename
Tags: bash
2

Uses vi style search / replace in bash to rename files. Works with regex's too (I use the following a script to fixup / shorten file names):

# Remove complete parenthetical/bracket/brace phrases

rename 's/\(.*\)//g' *

rename 's/\[.*\]//g' *

rename 's/\{.*\}//g' *

for i in $(find . -name *replaceme*);do mv "$i" "${i//replaceme/withme}"; done
2010-08-19 03:22:15
User: lefnire
Functions: find mv
Tags: bash
-5

rename is a great command, but can't get it to work on mac.

bind '"\C-h": "\`fc\ \-s\`"'
2010-08-16 17:58:16
User: rthemocap
0

This is similar to using `!!` or

In bash 4.1 it seems you can bind directly to a shell command, but I'm not running that version.

s="StrinG"; echo ${s,,}
2010-08-12 16:02:38
User: karpoke
Functions: echo
Tags: bash function
1

Another alternative is to define a function:

lower() {

echo ${@,,}

}

lower StrinG

find <dir> -name "<pattern>" | while read file; do echo -n .; output=$(<command>) || (echo ; echo $file:; echo "$output"; ); done
2010-08-10 11:45:31
User: Marco
Functions: echo find read
0

This is a command template for achiving the following:

* loop over files --> find -name "" | while read file; do ...; done

* output progress --> echo -n .

* execute some command on each file and save output for later usage --> output=$()

* if command failed, open subshell and echo newline --> || (echo;...;...;)

* echo output of command --> echo "$output"

for f in $(qlist -IC); do stat /usr/portage/"$f" > /dev/null; done
2010-08-09 11:29:55
User: homoludens
Functions: stat
0

Problem arises when ebuild gets removed from portage and you end up with old and unmaintained package that you cannot find standard way. This oneliner will give you list of those packages.

ffmpeg -i 100_0029.MOV -ss 00:00:00 -t 00:04:00 100_0029_1.MOV
2010-08-08 23:43:28
User: nickleus
1

i have a large video file, 500+ MB, so i cant upload it to flickr, so to reduce the size i split it into 2 files. the command shows the splitting for the first file, from 0-4 minutes. ss is start time and t is duration (how long you want the output file to be).

credit goes to philc: http://ubuntuforums.org/showthread.php?t=480343

NOTE: when i made the second half of the video, i got a *lot* of lines like this:

frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit

just be patient, it is working =)

exec 2>&1
2010-08-05 08:24:18
User: redy
Functions: exec
7

You have a script where =ALL= STDERR should be redirected to STDIN and you don't want to add "2>&1" at the end of each command...

E.G.:

ls -al /foo/bar 2>&1

Than just add this piece of code at the beginning of your script!

I hope this can help someone. :)

scp $user@$server:$path/to/file .
file=ftp://ftp.gimp.org/pub/gimp/v2.6/gimp-2.6.10.tar.bz2; ssh server "wget $file -O -" > $PWD/${file##*/}
2010-08-02 15:59:45
User: michaelmior
Functions: file ssh
Tags: ssh bash download
2

This command will download $file via server. I've used this when FTP was broken at the office and I needed to download some software packages.

find -E ~/Music -type f -iname "*search terms*" -iregex '.*\.(3g[2|p]|aac|ac3|adts|aif[c|f]?|amr|and|au|caf|m4[a|r|v]|mp[1-4|a]|mpeg[0,9]?|sd2|wav)' -exec afplay "{}" \; &
2010-07-30 22:26:03
User: CamJN
Functions: find
Tags: Os X bash
1

It works best as part of a function, such as the following:

MUSICROOT=~/Music

function fplay {

if [ $1 = '-v' ]; then

shift 1

find -E $MUSICROOT -type f -iname "*$**" -iregex '.*\.(3g[2|p]|aac|ac3|adts|aif[c|f]?|amr|and|au|caf|m4[a|r|v]|mp[1-4|a]|mpeg[0,9]?|sd2|wav)' -print -exec afplay "{}" \; &

else

find -E $MUSICROOT -type f -iname "*$**" -iregex '.*\.(3g[2|p]|aac|ac3|adts|aif[c|f]?|amr|and|au|caf|m4[a|r|v]|mp[1-4|a]|mpeg[0,9]?|sd2|wav)' -exec afplay "{}" \; &

fi

}

dd [...] p
2010-07-23 23:19:06
User: bartonski
Functions: dd
0

Use this if you're using vi editing mode.

Example use :

sudo vim /root/bin/ ##uh... autocomplete doesn't work... dd sudo ls /root/bin

##ah! that's the name of the file!

<p> sudo vim /root/bin/ ##resume here! Thanks readline!
<ctrl+u> [...] <ctrl+y>
2010-07-23 03:33:46
32

Example use :

sudo vim /root/bin/

##uh... autocomplete doesn't work...

<ctrl+u> sudo ls /root/bin

##ah! that's the name of the file!

<ctrl+y> sudo vim /root/bin/ ##resume here! Thanks readline!
for i in {0..255}; do echo -e "\e[38;05;${i}m${i}"; done | column -c 80 -s ' '; echo -e "\e[m"
2010-07-21 17:30:36
User: cout
Functions: column echo
5

I like the other three versions but one uses nested loops and another prints every color on a separate line. Both versions fail to reset colors before giving the prompt back.

This version uses the column command to print a table so all the colors fit on one screen. It also resets colors back to normal before as a last step.

alias ltmux="if tmux has; then tmux attach; else tmux new; fi"
2010-07-19 01:27:47
Functions: alias
Tags: bash alias sh tmux
0

If a tmux session is already running attach it, otherwise create a new one. Useful if you often forget about running tmuxes (or just don't care)

chmod -R u=rw-x+X,g=r-x+X,o= .
2010-07-16 18:42:00
User: donnoman
Functions: chmod
Tags: bash Ubuntu
-1

forces user to rw, group to r, and other to no access.

files will not be marked executable.

directories will be executable for users and groups only.

rp() { local p; eval p=":\$$1:"; export $1=${p//:$2:/:}; }; ap() { rp "$1" "$2"; eval export $1=\$$1$2; }; pp() { rp "$1" "$2"; eval export $1=$2:\$$1; }
2010-07-15 18:52:01
User: cout
Functions: eval export
0

I used to do a lot of path manipulation to set up my development environment (PATH, LD_LIBRARY_PATH, etc), and one part of my environment wasn't always aware of what the rest of the environment needed in the path. Thus resetting the entire PATH variable wasn't an option; modifying it made sense.

The original version of the functions used sed, which turned out to be really slow when called many times from my bashrc, and it could take up to 10 seconds to login. Switching to parameter substitution sped things up significantly.

The commands here don't clean up the path when they are done (so e.g. the path gets cluttered with colons). But the code is easy to read for a one-liner.

The full function looks like this:

remove_path() { eval PATHVAL=":\$$1:" PATHVAL=${PATHVAL//:$2:/:} # remove $2 from $PATHVAL PATHVAL=${PATHVAL//::/:} # remove any double colons left over PATHVAL=${PATHVAL#:} # remove colons from the beginning of $PATHVAL PATHVAL=${PATHVAL%:} # remove colons from the end of $PATHVAL export $1="$PATHVAL" } append_path() { remove_path "$1" "$2" eval PATHVAL="\$$1" export $1="${PATHVAL}:$2" } prepend_path() { remove_path "$1" "$2" eval PATHVAL="\$$1" export $1="$2:${PATHVAL}" }

I tried using regexes to make this into a cleaner one-liner, but remove_path ended up being cryptic and not working as well:

rp() { eval "[[ ::\$$1:: =~ ^:+($2:)?((.*):$2:)?(.*):+$ ]]"; export $1=${BASH_REMATCH[3]}:${BASH_REMATCH[4]}; };