Slashdot Mirror


Essential UNIX Tricks and Tools?

Chris Lesner asks: "What handy UNIX tricks/tools do you use everyday? I'm asking for stuff that amazes your friends and makes you wonder how they use UNIX w/o them. Some simple examples include: job control (with fg, bg/&, jobs, Ctrl-Z); moving login sessions between machines with Screen for vt100 and VNC for X11 and using screen and VNC to share login session b/w users for demos etc.; using find, xargs -i and echo to build command strings which after inspection can be piped back though bash e.g. `find . -type f | xargs -i{} echo "cp {} {}.bak" | bash` I'm asking b/c my source for this kind of information has dried up as my UNIX skills have matured. I'm guessing other Slashdot readers have the same problem. By the way, if you think the examples I give are lame I challenge you to better them!"

4 of 185 comments (clear)

  1. How about by Hard_Code · · Score: 5, Informative
    find . -type f | xargs -i{} echo "cp {} {}.bak" | bash
    find . -type f -exec cp '{}' '{}'.bak ';'
    --

    It's 10 PM. Do you know if you're un-American?
    1. Re:How about by Zapman · · Score: 4, Informative

      The slight problem with this (not in this case though) is you have the expense of forking and killing a lot of processes (equal to the number of files +1 for the find). On the mv or cp case, you can't (easily) get around it, but if you were to do:

      find . -type f -exec chmod 644 {} \;

      vs

      find . -type f | xargs chmod 644

      you'll find that the second runs amazingly faster, since it will group a lot of the commands together into 1.

      I did 'cd /usr/bin ; time find . -type f -exec ls {} \;' and got:

      find . -type f -exec ls {} \; 0.98s user 3.28s system 88% cpu 4.831 total

      I did 'cd /usr/bin ; time find . -type f | xargs ls -1 ' and got:

      find . -type f 0.00s user 0.02s system 31% cpu 0.063 total
      xargs ls -1 0.03s user 0.04s system 74% cpu 0.094 total

      That's a BIG difference, especially when you have a LOT of files.

      (NOTE: if I did a bare 'ls' with the xargs, the output would be different due to the way xargs works (man xargs for more details). It may or may not make a difference depending on how you're using the output. If you're shleping the whole line at once, it could make a huge difference... if you're spliting the lines by $IFS or something, then it's probably alright.)

      As for my contribution, I find these 3 find | xargs commands, wraped together in a script I call "makereadable" help me a LOT (for example, if you install from source, and the permissions get borked due to forgetting to set root's umask to 022):

      find . -type d -print | xargs chmod 755
      find . -type f -perm +0100 -print | xargs chmod go+x
      find . -type f -perm +0200 -print | xargs chmod go+r

      The first makes all directories 755. 99.99% of the time, that's what you want... just don't do it with /tmp (sticky bit will get wacked). The second finds all files that are executable by the user owner, and makes them executable to others too. The third finds what is readable to the user, and makes it readable too.

      If you want to do this with write permissions, you're probably doing something stupid you will regret later. Figuring out the command to do this is then left as an exercise for the reader. :-)

      --
      Zapman
  2. Real shell timesaver... by stevey · · Score: 4, Informative

    The biggest single command which saves me time is 'cd -' which changes to your previous directory under bash.

    It doesn't sound terribly useful, but it is... Take my word for it.

  3. best grep trick ever by novarese · · Score: 5, Informative

    Instead of
    $ ps aux | grep foo | grep -v grep
    use
    $ ps aux | grep [f]oo
    The brackets will show up in the ps output but don't match your pattern, so your grep is automaticly excluded from your final output.