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].
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
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.
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.
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.
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
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.
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.
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..
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.
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 :)
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)
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.
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).
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.
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.
"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?
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:
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. :
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.
> 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. :(
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.
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.
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
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.
Faucet is part of "netpipes", which is available for most Unixoid operating systems. I guess it was inspiration to build "netcat". But netcat was a absolute terrible hack of a program, so "socat" (socket-cat?) was born.
In case you need the functionality of bash's /dev/tcp [1] and you are pondering to install netcat or netpipes, do yourself a favor and just go for socat, it's insanely more powerful, read the manpage, read the examples!
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 ...
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:
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 %".
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.
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).
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.
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:
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]
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/