Settings

Theme

Favorite Unix Commands

clippy.in

204 points by nickwoodhams 13 years ago · 134 comments

Reader

aidos 13 years ago

It took me a moment to figure out what was going on there (with the whole clippy thing). The bulk of this list is the top commands from commandlinefu which has been on HN before [0], [1].

You can even go meta and install a command to let you search commandlinefu [2].

[0] http://news.ycombinator.com/item?id=527486

[1] http://news.ycombinator.com/item?id=3843373

[2] http://samirahmed.github.com/fu/

  • akavel 13 years ago

    I have a suspicion that it's actually a kind of targeted example-advertisement for the clippy thingo ;) and did somewhat work for me actually, I do now feel interested in learning more about the site

    • marginalboy 13 years ago

      On my mobile device, it was nearly unusable...

      • bsphil 13 years ago

        Maximized on a 1080p monitor it was irritating with far too many internal scroll bars.

        Great list of commands though.

jasonkostempski 13 years ago

Many years ago, before I ever used Linux in any serious fashion, I often used a password that ended with '!!'. One day I was playing around with setting up MySQL and was having a very hard time with something that seemed super simple. I don't remember exactly how I figured it out, I think I accidentally type my password at the wrong time in the command line and observed some odd behavior and, after hours, finally tracked it to the '!!' command. I decided to try a different root password for MySQL and it was smooth sailing from there. A few months later I was transferring a domain away from a small DNS hosting provider. After a week or so of waiting support told me they were having a hard time with my account and couldn't do what they needed to do to initiate the transfer. I don't have the support emails, must have been my old hotmail account, but something they said suggested they might be trying to run commands on my account with my password (I knew they stored it in plain text since it was in several emails from them and I knew they were Linux servers) and it reminded me about the '!!' issue I had with MySQL. I changed my password and they were able to move forward. I wish I had dug deeper into the issues at the time they occurred.

pajju 13 years ago

Check fasd, it will blow your mind, be prepared! :) Fasd (pronounced similar to "fast") is a command-line productivity booster.

I've been using this for a while, and trust me, its changed my command line workflow, and I wish, this should come as inbuilt for all POSIX shells!

Here is how it works -

If you use your shell to navigate and launch applications, fasd can help you do it more efficiently. With fasd, you can open files regardless of which directory you are in. Just with a few key strings, fasd can find a "frecent" file or directory and open it with command you specify. Below are some hypothetical situations, where you can type in the command on the left and fasd will "expand" your command into the right side. Pretty magic, huh?

  v def conf       =>     vim /some/awkward/path/to/type/default.conf
  j abc            =>     cd /hell/of/a/awkward/path/to/get/to/abcdef
  m movie          =>     mplayer /whatever/whatever/whatever/awesome_movie.mp4
  o eng paper      =>     xdg-open /you/dont/remember/where/english_paper.pdf
  vim `f rc lo`    =>     vim /etc/rc.local
  vim `f rc conf`  =>     vim /etc/rc.conf
Fasd offers quick access to files and directories for POSIX shells. It is inspired by tools like autojump, z and v. Fasd keeps track of files and directories you have accessed, so that you can quickly reference them in the command line.

The name fasd comes from the default suggested aliases f(files), a(files/directories), s(show/search/select), d(directories).

Fasd ranks files and directories by "frecency," that is, by both "frequency" and "recency." The term "frecency" was first coined by Mozilla and used in Firefox.

Here is the Link - https://github.com/clvv/fasd

csmatt 13 years ago

I forgot about the DNS querying of wikipedia. Probably could've used that to entertain myself on my flights over the holidays since I'm pretty sure gogo inflight passes DNS through.

Anyway, I'm a big fan of piping things into xargs. xxd is a terminal-based hex editor. It can convert both to and from hex to binary. I also use 'pgrep -lf 'partial_program_name' a lot in place of 'ps aux | grep partial_program_name'. 'pkill -9 partial_program_name' searches for and kills all processes matching the string.

  • avar 13 years ago

    If they allow DNS out you can use their Internet for free via iodine: http://code.kryo.se/iodine/

    I run an iodine server for myself, you can get free Internet at quite a few loginpage WiFi routers with it in airports, cafes etc.

    • ragmondo 13 years ago

      ssssssh ! When proxying over DNS becomes mainstream, it'll be shutdown !!

    • hayksaakian 13 years ago

      interesting that there's an android package.

      Could it turn your old android device into an HTTP tunnel?

  • amboar 13 years ago

    +1 for xxd, great for debugging purposes e.g. analysing serial output from socat (also mentioned by another commentor below).

robbles 13 years ago

Handy addition to the "mount | column -t" trick:

You can use this within Vim to pretty-format text tables, initialization of variables, etc. Just highlight the lines in question in visual line mode (V) and type

    !column -t<CR>
to pipe the lines through the column command.
SkippyZA 13 years ago

Ctrl+l is my most used command. I need a clean terminal

  • scott_s 13 years ago

    Huh. I've always just called "clear".

  • MikeCodeAwesome 13 years ago

    Same here; and love that it doesn't clear the command line you're currently typing.

    Does anyone know if there's a key command for clearing the scroll buffer?

  • Newky 13 years ago

    I second this, I also find myself impulsively smashing enter multiple times sometimes between commands, if I am typing in a series of commands, its just so my brain can catch up with what I want to do.

  • chrismsnz 13 years ago

    Nice

    Ctrl+D for quick logout too.

  • alphakappa 13 years ago

    Cmd + K on the OS X Terminal.

    • mmorett 13 years ago

      That's gold. I've been using "clear" this whole time and hated it, particularly since I'm used to "cls" from MS-DOS. So, for me, the way to clear the screen was:

      cls <enter> clear<enter>

      lol.

      I see Cmd + K on the menu now, but I guess I wasn't curious enough to poke around. Thanks a bunch.

  • jdefr89 13 years ago

    didn't know this hotkey existed.. nice

q_revert 13 years ago

a few nice ones here too, http://www.pixelbeat.org/cmdline.html, http://www.pixelbeat.org/docs/linux_commands.html

always worth looking at these types of lists imo, whilst some of the commands mightn't really fit into your workflow or seem useful immediately, they're often exactly the snippets of information that can save hours at a later stage..

loudmax 13 years ago

I have this in my .bashrc:

function lc() { if [[ "$#" -gt 1 ]]; then for DIR in "$@"; do echo -n "$DIR - " ; ls -AU1 $DIR | wc -l ; done ; else ls -AU1 "$@" | wc -l ; fi; }

So, "lc /dir" will count the number of files in /dir and "lc /dir/*" will count the files in subdirectories of /dir. This is useful if you're working in an environment where you may have thousands of files in a directory, and a regular "ls -l" will lock your terminal while it eats your entire scrollback buffer.

  • pooriaazimi 13 years ago

    Here's an idea: always pipe ls throug a pager! If it's less than a page, it would just print the results (you have to set some flags on less that I don't remember). If it's more, then press d or /term-to-search :)

    • crazydiamond 13 years ago

         less -F
      
      Won't page if less than one screenful. zsh users can also do:

          < filename
      
      (less than character)
  • Nick_C 13 years ago

    This might be quicker than firing up a shell script:

    > lc /dir" will count the number of files in /dir

      find /dir -type f -maxdepth 1 | wc -l
    
    > and "lc /dir/*" will count the files in subdirectories of /dir.

      find /dir -type f -mindepth 2 | wc -l
tlarkworthy 13 years ago

grep -r . "some random debug message" (searches for the passage recursively in all files from the directory it was executed, the main reason I like developing in linux more than windows)

  • jlgreco 13 years ago

    If you are searching inside code specifically, you may like 'ack'. It does the same thing grep does, except it has preset 'excludes', is recursive by default, and the output is a bit prettier.

  • alexkus 13 years ago

        grep -rs
    
    or (more commonly for me):-

        grep -rsi
    
    (The -s supresses errors about unreadable files that may clutter the output. -i for case insensitivity.)
  • pacaro 13 years ago

    On windows

    findstr /SPINC:"some random debug message" *

    Will do the same. FINDSTR is no grep, but for very simple cases like this is just fine

    SPINC and SPIMC are my favorite options...

jcampbell1 13 years ago

I have never understood the love for `sudo !!`. I think `ctrl+pa sudo ` is faster, explicit, and more versatile.

  • kami8845 13 years ago

    I disagree. I think typing one more command "sudo !!" is much easier and straight-forward than doing

    1. Ctrl+p. Go to the previous line in bash history.

    2. Ctrl+a. Go to the beginning of the new line.

    3. Type "sudo ". While you're typing your whole commandline shifts around as well.

    The latter mixes history commands, navigation commands and also modifies a previous command instead of just typing a new 7-letter command. It's also more in terms of keystrokes (though just barely).

    • why-el 13 years ago

      You know writing out their function does not make them longer. ;) I agree with the parent because my left pinky is always on capsLock (my ctrl; I swapped caps with ctrl) so a ctrol ap is far easier than to go to shift + 1 twice(to type !). Again, this can be different in other keyboards/setups.

      • kami8845 13 years ago

        I just wanted to illustrate the increased complexity and different domains of the commands.

  • fusiongyro 13 years ago

    My favorite thing about `sudo !!` is that when you IM it to your friend who's learning Unix they'll take that literally rather than realize they should type it into their terminal, leading to a hilarious teachable moment months later when they actually watch you using the command line.

  • aidos 13 years ago

    You know, I never knew ctrl-p - that's a much nicer way of doing it.

madao 13 years ago

Alt Sys Rq o - useful if you need to shut down a system and your kvm is not working.

http://en.wikipedia.org/wiki/Magic_SysRq_key

  • nitrogen 13 years ago

    It's probably a good idea to tErminate, kIll, Sync, and remoUnt-ro before hitting Off or reBoot.

bcoates 13 years ago

I'm a fan of using cut or sed or awk and ending it with:

  | sort | uniq -c | sort -n -r | head
to get a nice top 10 whatevers in the whoosit
nickwoodhamsOP 13 years ago

Please comment if you have a favorite not on this list.

  • cnvogel 13 years ago

    If you use tmux (or screen) you want to use byobu!

    https://launchpad.net/byobu

    https://www.google.de/search?q=byobu+tmux&tbm=isch

    It's a fancy statusbar that shows CPU speed, IP-address, hostname, ...

  • jlgreco 13 years ago

    'tac'. It is 'cat', but backwards.

    • SenorWilson 13 years ago

      Are you some kind of genius?

      • jlgreco 13 years ago

        If you enjoy 'tac', you might also enjoy 'sponge'.

        Spong 'soaks up' input an releases it all on one chunk so that you can do things like:

          cat foo | sponge foo
        
        (`cat foo > foo` does not work)

        That's neat and all, but what if you don't have sponge? Well, just use tac twice!

          cat foo | tac | tac > foo
        
        (Obviously this is rather wasteful ;))
        • thristian 13 years ago

          I cannot understand how this works.

          "cat foo > foo" breaks, because the shell truncates the file "foo" while it's setting up the redirection, before it launches "cat foo", and so cat has nothing to read.

          "cat foo | sponge foo" works because the shell is not responsible for writing to foo; it launches cat (which opens the file for reading) then launches sponge (which eventually opens the file for writing).

          I would thus expect "cat foo | tac | tac > foo" to fail in the same way as "cat foo > foo" because the shell is still going to open the file foo and truncate it, but experimentation shows that it does actually work. Is it because the shell launches each pipeline one at a time, so cat has read the file before "tac > foo" truncates it? Is it a race-condition or a corner-case?

          • jlgreco 13 years ago

            That's a good question. I had though it worked because the truncate would not actually happen until tac actually wrote something, but now that I look at it more I don't think that is actually the case. `cat > foo` immediately truncates foo before anything is written. Also `tac foo > foo` doesn't work, which discredits my hypothesis that tac's buffering was causing it.

            Furthermore `cat foo | cat > foo` does not work, but `cat foo | cat | cat > foo` does work.

            I suspect this behavior is actually a race condition of some sort.

            Edit: definetly a race condition, shown by larger files:

              % wc -l foo
              1310720 foo
              % cat foo | cat | cat > foo
              % wc -l foo
              16384 1
    • thristian 13 years ago

      I always get confused between "tac" and "rev", which is also "cat, but backwards" for a certain definition of "backwards".

  • cnvogel 13 years ago

    When rewriting large amounts of ASCII text (or comments in Code), I really find "par" helpful.

        : Just use it in :
        : vi with your cursor in front of a badly wrapped block of text. :
        : Press !}par<enter> and the text will be :
        : piped to par :
        : which fixes up :
        : the :
        : formatting and keeps aligned frame markers :
        : intact magically. :
    
    
        : Just use it in vi with your cursor in front of a badly wrapped   :
        : block of text. Press !}par<enter> and the text will be piped     :
        : to par which fixes up the formatting and keeps aligned frame     :
        : markers intact magically.                                        :
    
    http://www.nicemice.net/par/ (or apt-get install par)
    • satiani 13 years ago

      Or you can just select the block of text and type gq. This will do what par does, and can be adjusted with vim's 'textwidth' and 'formatoptions' settings.

  • zeraholladay 13 years ago

        export CDPATH=.:~/projects
        export PS1="$(uname -n)$ "
        alias ltr='ls -ltr'
    
    More of a procedure, always list file and edit the command before deleting it:

        $ ll file.txt
        -rw-r--r--  1 zera  staff  0 Jan  7 20:28 file.txt
        Ctrl-p, Ctrl-a, Ctrl-d, Ctrl-d, r,m
        $ rm file.txt
    
    So this is a sanity check to avoid this mistake:

        $ rm *.txt
    
    *Edit, one more:

    Ensure you overwrite a file (or aren't):

        $ cp -i ~/file.config /etc/
  • codegeek 13 years ago

        alias lsd="ls -ltrF | grep ^d"
    
    Helps me quickly list only directories. Any better alternatives ?
  • mappu 13 years ago

        sl
  • asparagui 13 years ago

    alias emacs="nano"

  • jfb 13 years ago

    tsort. It's pointless until you need it, but when you need it, it's totally awesome.

    less. Overkill, but SO MUCH BETTER THAN tail -f. Seriously. You can toggle "follow mode" without losing your place in the incoming stream.

    • Florin_Andrei 13 years ago

      > less. Overkill, but SO MUCH BETTER THAN tail -f. Seriously.

      If you do this on my servers, I am going to find you, and then I am going to kill... um... your process.

      less with SHIFT-F takes a whole CPU core to run on a busy log file. tail -f takes almost nothing to run. Now combine that information with the reality of a whole bunch of devs who don't know it or don't care about it. :(

    • alexkus 13 years ago

      I prefer:-

          tail --follow=filename
      
      to:

          tail -f filename
      
      The former will spot inode changes and reopen the filename if the file wraps (or has something else done to it to change its inode). The latter will just sit there seeing no new input in such cases.
    • mje__ 13 years ago

      multitail[1] is also really nice for following multiple log files. It can do highlighting of lines based on regex's, and has built-in highlighting of a wide variety of log formats

      [1] http://www.vanheusden.com/multitail/features.php

      • jlgreco 13 years ago

        Does anybody know if there is a good standalone regex highlighter? I usually use `ack --passthru`, but that has always seemed a tad.. overkillish to me.

    • cjg_ 13 years ago

      Hm, can you start at the end of file without reading the entire file with less? Use case is tailing large logs.

      • ralph 13 years ago

        Yes, either type G when presented with the top of the file or pass +G on the command line. It will then read all the intervening file to calculate the line numbers, and tells you it's doing this and to interrupt it to stop. To prevent it doing this in the first place use the -n option.

        "less -n huge_file" and then G only reads the start and end of the file. Type G again to move to the latest end of the file if it's growing.

      • jfb 13 years ago

        Yes. It is CPU intensive (see auntie post above).

  • lelf 13 years ago

    dtrace :P

crazydiamond 13 years ago

On zsh, "print -rC2" for printing some listing in 2 column format. The number of columns (C) can be specified. (print is a builtin).

zsh's file globbing is awesome. Some simple ones:

    *(.)  - only files  
    *(/)  - only dirs  
    *(.m0) - files modified today  
    *(.om[1,15]) - 15 recently modified files
drinchev 13 years ago

faucet 80 --in cat

This is useful for creating a connection for receiving the input of what you get...

e.g. running

faucet 80 --in cat

and later

curl http://127.0.0.1:80

will deliver to you console :

GET / HTTP/1.1 User-Agent: curl/7.21.4 (i686-pc-linux-gnu) libcurl/7.21.4 OpenSSL/0.9.8n zlib/1.2.5 libidn/1.19 Host: 127.0.0.1:900 Accept: /

INTPenis 13 years ago

One of my favorite aliases that wasn't listed.

alias easy_search="curl -s http://pypi.python.org/simple/ | perl -ne 'print if s/<[^>]+>//g && $.>1'|grep"

ragmondo 13 years ago

I like the wikipedia DNS text lookup - I work in a "firewalled" environment where the unices are only allowed DNS queries. If only wikipedia could provide central switchboard numbers in their text fields as well ...

DanBC 13 years ago

Single user mode on an HPUX machine was, I think, the most useful to me.

(http://www.unixhub.com/docs/hpux/hpux_boot.html)

I wish I still had that machine, but I do not.

  • RexRollman 13 years ago

    I love playing with OSes and HPUX was one of the ones I didn't get to play with (not to mention Irix and AIX).

kungpoo 13 years ago

What a ridiculous fixed header. It's taking up 2/3 of my phone's screen.

carlesfe 13 years ago

Here's my list, a very compact plaintext file: http://mmb.pcb.ub.es/~carlesfe/unix/tricks.txt

overgun77 13 years ago

Not really a unix command, but a vi command that has been really useful, specially if you do lots of editing protected files and want to keep your custom vim configuration:

!sudo tee %

  • sousousou 13 years ago

    Need to send the contents of the file to that command. Otherwise it effectively empties the file. (typo?)

    :%!sudo tee %

  • ralph 13 years ago

    What vi mode is that entered in?

    • emillon 13 years ago

      Normal mode (:help :! for more information on this command).

      • ralph 13 years ago

        What benefit does

            :!sudo tee %
        
        have over doing it at the command line other than filling in the current filename for you? I suspect the original poster meant something like "gg!Gsudo tee %".
amalakar 13 years ago

I find this site handy for clever commands: http://www.commandlinefu.com/commands/browse

glazskunrukitis 13 years ago

I like those un- commands for easier archive extracting, e.g.:

alias unbz2='tar xvjf' alias untar='tar xvfz'

  • prakashk 13 years ago

    I use atool (http://www.nongnu.org/atool/), which is packaged in Debian and Ubuntu (and I am sure in other distributions as well). It supports all the formats I have encountered so far (tar, tar.gz, zip, rar, bz2 and others).

    It provides a few commands, two of which I use the most:

        als - list files in an archive
        aunpack - exatract files from an archive
    
    The best part is aunpack extracts files into a subdirectory (I hate polluting the current directory with files from a new archive which wasn't properly packaged to include a directory), and it does it only when necessary. Before I found it, I always used to create a temp directory, cd to it, unpack into it, and possibly move files around etc.
  • Erwin 13 years ago

    Fortunately GNU tar has gotten smarter. You can do just "tar xvf" now and it will do the right thing whether the archive is compressed or not.

    When creating the archive, you still have to use your favorite compression method (XZ aka LZMA, activated with J is even better, but slightly slower, than bzip).

  • rbonvall 13 years ago

    I always use dtrx (do the right extraction). Check out its features:

    http://brettcsmith.org/2007/dtrx/

dchichkov 13 years ago

mount -t overlayfs -o lowerdir=$HOME,upperdir=/tmp/tmpHOME overlayfs $HOME

  • jlgreco 13 years ago

    What is the purpose of this?

    • dchichkov 13 years ago

      Very useful, if you want to make a checkpoint (possibly for /), break things and then get back to the original state.

      If you'd do that for / , your own system would start behaving, like a system booted from LiveCD. And, after reboot, would return to the origanal state.

      Overlayfs is pretty cool actually. Allows you to overlay a lower directory with some other upper directory and mount the result somewhere. All the changes that you are making in the mounted directory would be visible to you, and would be stored in the upper directory.

      In the example above, after running this command, content of your $HOME would stop changing. But you still will be able to change it, with all the changed content going into tmpHome.

      • jlgreco 13 years ago

        Ah, very clever. I figured it would make changes to $HOME temporary but couldn't immediately think of why you would do that.

      • csmatt 13 years ago

        Awesome! I didn't know what overlayfs was, but recently saw it while playing with OpenWRT. Thanks for sharing :)

    • dchichkov 13 years ago

      And you can also use it on EC2, to reduce costs of EBS I/O.

gshakir 13 years ago

Great post! I think "lsof" should be there along with "netstat".

vog 13 years ago

There's a typo: The command is spelled "apropos" (not apropo).

gailees 13 years ago

I think I might've just saved days of my life....thank you!

tzury 13 years ago

that's the original

http://www.commandlinefu.com/commands/browse/sort-by-votes

gbog 13 years ago

esc-#, comments the current line

ctrl-\, kills current process even xtail

xtail, tails dirs

tweaks in .inputrc to have up and down arrow do backward history search, like in ipython.

donquix 13 years ago

sudo !!

Instant favorite

  • AaronBBrown 13 years ago

    I often alias `sudo` to `fucking` to help vent my frustrations

        $ rm -rf somedir
        rm: somedir/: Permission denied
        $ fucking !!
    • prakashk 13 years ago

      I have been known to use sudo when it is not appropriate to use the f-word ;)

  • amboar 13 years ago

    Along the lines of magic shell variables, there's also '!$', which selects the last argument of the previous command. Often I'm looking at different aspects of the same file:

        $ file foo
        $ ls -lh !$
        $ vim !$
  • mixedbit 13 years ago

    I don't find this one useful. [up-arrow] automatically inserts the last command, which gives a generic mechanism to correct the command and it requires no more typing than !!: [up-arrow][control-a]sudo [enter]

fusiongyro 13 years ago

Remove trash Emacs leaves lying around:

$ find . -name \*~ -delete

re_todd 13 years ago

alias cd5='pushd .; cd ../../../../..'

This lets me cd five directories at a time, and if I want to go back, I do a "popd"

Zenst 13 years ago

in ksh set -o vi so I can use the vi editor to navigate the command line history.

t_lark 13 years ago

grep -r . "Some random debug msg"

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection