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/
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.
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
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:
Quietly get a webpage from wikipedia: curl -s
By default, don't output anything: sed -n
Search for interesting lines: /<tr valign="top">/
With the matching lines: {}
Search and replace any html tags: s/<[^>]*>//g
Finally print the result: p
If your locale has Monday as the first day of the week, like mine in the UK, change the two $7 into $6
Find files matching multiple descriptions (*.c and *.cpp) excluding multiple directories (unit-test and android).
Search for files and list the 20 largest.
find . -type f
gives us a list of file, recursively, starting from here (.)
-print0 | xargs -0 du -h
separate the names of files with NULL characters, so we're not confused by spaces
then xargs run the du command to find their size (in human-readable form -- 64M not 64123456)
| sort -hr
use sort to arrange the list in size order. sort -h knows that 1M is bigger than 9K
| head -20
finally only select the top twenty out of the list
Take a file and ,."()?!;: give a list of all the words in order of increasing length.
First of all use tr to map all alphabetic characters to lower case and also strip out any puntuation.
A-Z become a-z
,."()?!;: all become \n (newline)
I've ignored - (hyphen) and ' (apostrophe) because they occur in words.
Next use bash to print the length ${#w} and the word
Finally sort the list numerically (sort -n) and remove any duplicates (sort -u).
Note: sort -nu performs strangely on this list. It outputs one word per length.
Count the number of active connections to a MySQL database.
The MySQL command "show processlist" gives a list of all the active clients.
However, by using the processlist table, in the information_schema database, we can sort and count the results within MySQL.
List the full path of some files.
You can add ".*" on the end if you want to display hidden files.
Print all lines between two line numbers
This command uses sed(1) to print all lines between two known line numbers in a file. Useful for seeing output in a log file, where the line numbers are known. The above command will print all lines between, and including, lines 3 and 6.
Find the package a file belongs to on an rpm-based distro.
Find files in a specific date range - in this case, the first half of last year.
-newermt = modification time of the file is more recent than this date
GNU find allows any date specfication that GNU date would accept, e.g.
find . -type f -newermt "3 years ago" ! -newermt "2 years ago"
or
find . -type f -newermt "last monday"
Move efficiently between directories.
.
This command adds a couple of extra features to cd, without affecting normal use.
CDPATH use is also unaffected. It introduces and environment variable CDDIR which is used as an alternate home directory.
.
Note: I don't want to alter $HOME because then all my dot files will move.
.
Examples:
.
cd dir
Change directory to "dir" (using CDPATH if necessary)
.
cd dir/file.txt
Change directory to "dir" (containing folder of "file.txt")
This allows you to cut'n'paste, or use
.
CDDIR is unset
cd
Change directory to $HOME
.
CDDIR=/home/flatcap/work
cd
Change directory to /home/flatcap/work
.
For convenience, put the command, and the following, in your .bashrc or .bash_profile
export CDDIR="/home/flatcap/work"
alias cdd="CDDIR=$(pwd)"
Give files a random name (don't ask why :-)
The function will rename files but maintain their extensions.
BUG: If a file doesn't have an extension it will end up with a dot at the end of the name.
The parameter '8' for pwgen controls the length of filenames - eight random characters.
Recursively find php files and replace tab characters with spaces.
Options:
"\*.php" -- replace this with the files you wish to find
"expand" -- replace tabs with spaces (use "unexpand" to replace spaces with tabs)
"-t4" -- tabs represent 4 spaces
Note: The IFS="" in the middle is to prevent 'read' from eating leading/trailing whitespace in filenames.
Countdown clock - Counts down from $MIN minutes to zero.
I let the date command do the maths.
This version doesn't use seq.
Are the two strings anagrams of one another?
sed splits up the strings into one character per line
the result is sorted
cmp compares the results
Note: This is not pretty. I just wanted to see if I could do it in bash.
Note: It uses fewer characters than the perl version :-)
Take a folder full of files and split it into smaller folders containing a maximum number of files. In this case, 100 files per directory.
find creates the list of files
xargs breaks up the list into groups of 100
for each group, create a directory and copy in the files
Note: This command won't work if there is whitespace in the filenames (but then again, neither do the alternative commands :-)
http://en.wikipedia.org/wiki/Pascal%27s_triangle
This one's for bartonski. Enjoy.
132 characters. I'm sure we can do better.
Note: after row 64 we overflow integer maths.
Calculate pi from the infinite series 4/1 - 4/3 + 4/5 - 4/7 + ...
This expansion was formulated by Gottfried Leibniz: http://en.wikipedia.org/wiki/Leibniz_formula_for_pi
I helped rubenmoran create the sum of a sequence of numbers and he replied with a command for the sequence: 1 + 2 -3 + 4 ...
This set me thinking. Transcendental numbers!
seq provides the odd numbers 1, 3, 5
sed turns them into 4/1 4/3 4/5
paste inserts - and +
bc -l does the calculation
Note: 100 million iterations takes quite a while. 1 billion and I run out of memory.