I frequently run the ls command after running the cd command. How can I create an alias (like cs) for this operation?

6 Answers 6


From Bash Tips and Tricks: 'cd' with style:

Finally, I want to show you how to write your own custom replacement for the 'cd' command.

Do you find yourself always typing the same thing upon changing into a directory? You probably at least list the files there every time, perhaps so much that your hands automatically type 'ls' after every 'cd'.

Well, by trying every way I could think of, it turns out there's only one way to properly accomplish the goal we're seeking. We have to create a shell function.

Shell functions are part of shell programming. Like in compiled programming languages, functions provide a sort of procedural modularizability. One can create a generic function to perform an often-used bit of logic or computation with different parameters. In this case, the parameter is the current working directory.

Here's a simple one:

function cs () {
    cd $1

As @geirha corretly notes, the above function will fail if you try to switch to a directory with a space in its name:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

You should instead use the following function:

function cs () {
    cd "$@" && ls

Once you add that code to your ~/.bashrc, you should be able to do this:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
  • 1
    That'll fail for directories containing whitespace. See the comment to dv3500ea's answer.
    – geirha
    Feb 2, 2011 at 8:15

You can use the builtin command in bash :

function cd() {
    if [ $# -eq 0 ]; then 
    builtin cd "${new_directory}" && ls
  • 2
    This is pretty slick. I had a solution similar to @Florian in my .bashrc for a very long time, but this is much more satisfactory for when I forget that colleagues don't have my 'cs' alias on their computers.
    – dino
    Oct 1, 2012 at 12:45
  • I like this answer the best. For some reason, you can't use aliases to overwrite the command, so you have to make a function like this answer. :D
    – trusktr
    Oct 30, 2012 at 20:45
  • But what about non-builtin commands? For example, the above won't work for overwriting the ls command. Is there some keyword to use instead of "builtin"?
    – trusktr
    Oct 30, 2012 at 20:52
  • use the full path for it, example : function ls() { /usr/bin/ls $* }
    – OneOfOne
    Oct 31, 2012 at 17:40
  • I had problems redefining cd because rvm changes my cd definition too. See stackoverflow.com/a/19941991/1601989
    – DavidGamba
    May 21, 2014 at 10:22

Use a function instead of an alias:

cs() { cd "$1" && ls; }
  • 5
    +1, as this version will stop if 'cd' fails.
    – htorque
    Dec 4, 2010 at 12:44

Thanks Florian Diesch for the tip of using a function. I can't use cs as the name because there is a cs command in the csound package, so I used lc.

I added this to ~/.bash_aliases (nano ~/.bash_aliases):

function lc () {
    cd $1;

The terminal needs to be reset for this to come into effect.

  • 8
    Having $1 unquoted like that will make it fail if the directory contains whitespace. Also, you should check the return value of cd; if it failed (e.g. permission denied), there's no point in running the ls. lc() { cd "$@" && ls; }
    – geirha
    Feb 2, 2011 at 8:13

As an expansion to this function: cs() { cd "$1" && ls; }, you may want to pass all of the function's arguments to cd by using $@ instead of "$1" as such: cs() { cd $@ && ls; }.


I had problems redefining cd because rvm changes my cd definition too. See https://stackoverflow.com/a/19941991/1601989. I didn't really want to use builtin because that would skip whatever rvm is doing.

I added the following to my .bashrc:

# cdd allows you to cd to the directory of the given file or directory
function cdd()
  if [[ $# -eq 0 ]]; then
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
    cd "$*"

function cs()
  cdd $* && ls

And then after the rmv line in the .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.