Monday, January 14, 2008

Unix Question And Answers

How do I get a recursive directory listing?
One of the following may do what you want: ls -R (not all versions of "ls" have -R) find . -print (should work everywhere) du -a . (shows you both the name and size) If you're looking for a wildcard pattern that will match all ".c" files in this directory and below, you won't find one, but you can use % some-command `find . -name '*.c' -print` "find" is a powerful program. Learn about it.

How do I get the current directory into my prompt?
It depends which shell you are using. It's easy with some shells, hard or impossible with others. C Shell (csh): Put this in your .cshrc - customize the prompt variable the way you want. alias setprompt 'set prompt="${cwd}% "' setprompt # to set the initial prompt alias cd 'chdir \!* && setprompt' If you use pushd and popd, you'll also need alias pushd 'pushd \!* && setprompt' alias popd 'popd \!* && setprompt' Some C shells don't keep a $cwd variable - you can use `pwd` instead. If you just want the last component of the current directory in your prompt ("mail% " instead of "/usr/spool/mail% ") you can use alias setprompt 'set prompt="$cwd:t% "' Some older csh's get the meaning of && and reversed. Try doing: false && echo bug If it prints "bug", you need to switch && and (and get a better version of csh.) Bourne Shell (sh): If you have a newer version of the Bourne Shell (SVR2 or newer) you can use a shell function to make your own command, "xcd" say: xcd() { cd $* ; PS1="`pwd` $ "; } If you have an older Bourne shell, it's complicated but not impossible. Here's one way. Add this to your .profile file: LOGIN_SHELL=$$ export LOGIN_SHELL CMDFILE=/tmp/cd.$$ export CMDFILE # 16 is SIGURG, pick a signal that's not likely to be used PROMPTSIG=16 export PROMPTSIG trap '. $CMDFILE' $PROMPTSIG and then put this executable script (without the indentation!), let's call it "xcd", somewhere in your PATH : xcd directory - change directory and set prompt : by signalling the login shell to read a command file cat >${CMDFILE?"not set"} <