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.

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.

Universal configuration monitoring and system of record for IT.

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:



May 19, 2015 - A Look At The New Commandlinefu
I've put together a short writeup on what kind of newness you can expect from the next iteration of clfu. Check it out here.
March 2, 2015 - New Management
I'm Jon, I'll be maintaining and improving clfu. Thanks to David for building such a great resource!

Top Tags



Psst. Open beta.

Wow, didn't really expect you to read this far down. The latest iteration of the site is in open beta. It's a gentle open beta-- not in prime-time just yet. It's being hosted over at UpGuard (link) and you are more than welcome to give it a shot. Couple things:

  • » The open beta is running a copy of the database that will not carry over to the final version. Don't post anything you don't mind losing.
  • » If you wish to use your user account, you will probably need to reset your password.
Your feedback is appreciated via the form on the beta page. Thanks! -Jon & CLFU Team

All commands from sorted by
Terminal - All commands - 12,392 results
git show --relative --pretty=format:'' --name-only HASH
2009-08-14 03:36:03
User: lingo
Tags: git files list

Lists ONLY the files changed by the given HASH/HEAD/list of hashes, etc. The message, commit ID, author, etc. is not included

rename 's/^/prefix/' *
2009-08-14 03:26:45
User: lingo
Functions: rename

Best to try first with -n flag, to preview

wget -qO - http://www.commandlinefu.com/feed/tenup | xmlstarlet sel -T -t -o '<x>' -n -t -m rss/channel/item -o '<y>' -n -v description -o '</y>' -n -t -o '</x>' | xmlstarlet sel -T -t -m x/y -v code -n
2009-08-14 02:44:00
User: fsilveira
Functions: wget

This lengthy cryptic line will print the latest top 10 commandlinefu.com posts without their summaries. To print also their respective summaries use the following (even bigger) command line:

wget -qO - http://www.commandlinefu.com/feed/tenup | xmlstarlet sel -T -t -o '<doc>' -n -t -m rss/channel/item -o '<item>' -n -o '<title>' -v title -o '</title>' -n -o '<description>' -v description -o '</description>' -n -o '</item>' -n -t -o '</doc>' | xmlstarlet sel -T -t -m doc/item -v description/code -n -v title -n -n

It is recommended to include this line into a shell script to be easily run, as I do myself. You could also use the following URLs to browse the top 3 commands:

wget -qO - http://www.commandlinefu.com/feed/threeup | xmlstarlet ...

.. or all others:

wget -qO - http://feeds2.feedburner.com/Command-line-fu | xmlstarlet ...

PS: You need to install "xmlstarlet" to run it. It is found in Debian APT repositories (apt-get install xmlstarlet) or under the http://xmlstar.sourceforge.net/ URL.

tr " " "\n" | nl
2009-08-13 14:36:18
User: dendoes
Functions: tr

translate and number lines is simpler and you use tr to choose your delimiter (eg for csv files)

id="dMH0bHeiRNg";mplayer -fs http://youtube.com/get_video.php?video_id=$id\&t=$(curl -s http://www.youtube.com/watch?v=$id | sed -n 's/.*, "t": "\([^"]*\)", .*/\1/p')
2009-08-13 14:16:01
User: matthewbauer
Functions: id sed

The original doesn't work for me - but this does. I'm guessing that Youtube updated the video page so the original doesn't work.

2009-08-13 14:15:39
User: jackhab
Tags: xwindows

A lot of X applications accept --geometry parameter so that you can set application size and position. But how can you figure out the exact arguments for --geometry? Launch an application, resize and reposition its window as needed, then launch xwininfo in a terminal an click on the application window. You will see some useful window info including its geometry.

perl -F' ' -MDate::Format -pale 'substr($_, index($_, $F[1]), length($F[1]), time2str("%C", $F[1]))' file.log
2009-08-13 13:57:33
Functions: perl
Tags: perl log

When you have one of those (log)files that only has epoch for time (since no one will ever look at them as a date) this is a way to get the human readable date/time and do further inspection.

Mostly perl-fu :-/

find . -type f -printf '%20s %p\n' | sort -n | cut -b22- | tr '\n' '\000' | xargs -0 ls -laSr
2009-08-13 13:13:33
User: fsilveira
Functions: cut find ls sort tr xargs
Tags: sort find ls

This command will find the biggest files recursively under a certain directory, no matter if they are too many. If you try the regular commands ("find -type f -exec ls -laSr {} +" or "find -type f -print0 | xargs -0 ls -laSr") the sorting won't be correct because of command line arguments limit.

This command won't use command line arguments to sort the files and will display the sorted list correctly.

git checkout -
2009-08-13 10:43:08
User: sunny256

Very useful if you keep switching between the same two branches all the time.

pwdx pid
find . -name "*.[ch]" -exec grep "TODO" {} +
2009-08-13 06:17:22
User: peshay
Functions: find grep
Tags: grep

-exec works better and faster then using a pipe

ps aux | grep [p]rocess-name
2009-08-13 05:44:45
User: olorin
Functions: grep ps

As an alternative to using an additional grep -v grep you can use a simple regular expression in the search pattern (first letter is something out of the single letter list ;-)) to drop the grep command itself.

ps aux | grep process-name | grep -v "grep"
for a in *; do mv $a prefix${a}; done
grep -r --include="*.[ch]" pattern .
2009-08-13 01:41:12
User: sitaram
Functions: grep
Tags: grep

doesn't do case-insensitive filenames like iname but otherwise likely to be faster

mate - `find * -type f -regex 'REGEX_A' | grep -v -E 'REGEX_B'`
2009-08-12 22:24:08
User: irae
Functions: grep

This does the following:

1 - Search recursively for files whose names match REGEX_A

2 - From this list exclude files whose names match REGEX_B

3 - Open this as a group in textmate (in the sidebar)

And now you can use Command+Shift+F to use textmate own find and replace on this particular group of files.

For advanced regex in the first expression you can use -regextype posix-egrep like this:

mate - `find * -type f -regextype posix-egrep -regex 'REGEX_A' | grep -v -E 'REGEX_B'`

Warning: this is not ment to open files or folders with space os special characters in the filename. If anyone knows a solution to that, tell me so I can fix the line.

taskset -cp <core> <pid>
2009-08-12 20:45:46
User: din7
Functions: taskset

Set the affinity of a process to a particular core(s).

Arguments for processor include a comma separated list, or a range. (example: 1,2 or 0-3)

You can use top in smp mode (Press 1) to see the changes to the affinity.

< /var/log/syslog ccze -A | less -R
ls -laR > /path/to/filelist
2009-08-12 17:53:40
User: shaiss
Functions: ls

Ever need to output an entire directory and subdirectory contents to a file? This is a simple one liner but it does the trick every time. Omit -la and use only -R for just the names

for x in *.ex1; do mv "${x}" "${x%ex1}ex2"; done
setfile -a V foo.bar; setfile -a v foo.bar;
2009-08-12 17:16:03
User: JakeCarter
Tags: macosx finder

These commands will mark a file as hidden or visible to Mac OS X Finder. Notice the capitol V vs the lowercase v. This will also work for directories.

setfile -a V foo.bar; // This marks the file invisible

setfile -a v foo.bar; // This marks the file visible

I have also found that adding the following aliases are helpful:

alias hide='setfile -a V'

alias show='setfile -a v'

find . -name "*.[ch]" | xargs grep "TODO"
nmap -n -iR 0 -sL | cut -d" " -f 2
svn diff | view -
not necessarily better, but many...!
2009-08-12 11:03:26
Tags: bash awk

( IFS=:; for i in $PATH; do echo $i; done; )

echo $PATH|sed -e 's/:/\n/g' # but the tr one is even better of course

echo $PATH|xargs -d: -i echo {} # but this comes up with an extra blank line; can't figure out why and don't have the time :(

echo $PATH|cut -d: --output-delimiter='

' -f1-99 # note -- you have to hit ENTER after the first QUOTE, then type the second one. Sneaky, huh?

echo $PATH | perl -l -0x3a -pe 1 # same darn extra new line; again no time to investigate

echo $PATH|perl -pe 's/:/\n/g' # too obvious; clearly I'm running out of ideas :-)