使CD自动ls


46

我发现我经常做以下事情:

%> cd bla/bla
%> ls

我希望每当我cd进入目录时,它就会自动执行ls

我摆弄.bashrc了一段时间,但不知道如何实现它。

Answers:


50

您可以使用以下功能执行此操作:

$ cdls() { cd "$@" && ls; }

&&意思是“ cd到一个目录下,如果成功(例如目录存在),运行ls”。像一样,使用&&运算符要好;于在两个命令之间使用分号运算符{ cd "$@" ; ls; }ls无论是否成功,第二条命令都将运行cd。如果cd失败,ls将打印当前目录的内容,这会使用户感到困惑。作为最佳实践,请使用&&而不是;

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

通常,重命名已经存在的命令是一种不好的做法,尤其是对于像这样的常用命令cd。而是使用其他名称创建一个新命令。如果cd使用也称为的函数或别名覆盖,则cd当您输入包含100,000个文件的目录时会发生什么?有许多使用的实用程序cd,它们可能会因这种异常行为而感到困惑。如果使用共享帐户(例如root与其他系统管理员一起使用时),则替换现有命令可能非常危险,因为环境与人们期望的环境不同。


那个命令真的改变目录了吗?从bash的手册页中:“在替换文本中没有使用参数的机制。如果需要参数,则应使用shell函数”
enzotib

@enzotib:是的,至少在我看来,这确实改变了目录。我更新了答案以显示的输出pwd。不知道这是否是最佳做法,但通常会这样做。有关某些示例,请参见tldp.org/LDP/abs/html/aliases.html
Stefan Lasiewski 2011年

2
第一:在这里不起作用。第二:他们在该页面中使用变量,而不是位置参数。第三:获取和惠益分享是不良做法的常见根源。
enzotib 2011年

1
别名在Snow Leopard上对我有效,但在CentOS5或CentOS6上无效。我将答案更新为仅使用功能。没有别名。
Stefan Lasiewski 2011年

1
对我不起作用。尝试了@frabjous答案,它可以工作:cd() { builtin cd "$@" && pwd; };-在macOS(Sierra 10.12.6)上使用标准bourne shell
旋转

39

我在我的.bashrc中有此文件,并且工作正常。

function cd {
    builtin cd "$@" && ls -F
    }

在.bashrc的较早版本中,我具有:[ -z "$PS1" ] && return,并且该行之后的所有内容仅适用于交互式会话,因此这不会影响cd脚本的行为。


1
到底是[ -z "$PS1" ] && return做什么的?
宪法

2
[ -z "$PS1" ]检查$PS(交互式提示变量)是否为“零长度”(-z)。如果长度为零,则表示尚未设置,因此Bash不能在交互模式下运行。在这种情况下,此时该&& return零件退出采购.bashrc
frabjous 2015年

1
检查交互的另一种方法是看i"$-"case "$-" in *i*) ;; *) return ;; esac
库萨兰达

@Kusalananda&frabjous:在某些情况下,应该使用一种代替另一种吗?
旋转

1
@Swivel PS1变量可能未设置或为空,并且外壳可能仍是交互式的(但没有提示)。我会检查$-以确保。
库沙兰丹

13

脱题,因为该问题被标记为/ bash,但是由于某些问题作为该问题的重复项被关闭,因此没有提及bash:

使用zsh:

chpwd() ls

每当当前目录更改时(通过cd,push,popd ...),zsh都会调用chpwd()函数。tcsh具有类似的功能,可能是zsh的来源。


4

为什么不为您的.bashrc文件添加别名?

就像是:

alias cdls='cd "$@" && ls'

@don_crissti函数和别名是不同的东西。那为什么不呢?
Jodka Lemon 2015年

这是OP所要求的最快,最干净的方法。我认为,函数应该用于更复杂的事情,而为经常键入的命令创建快捷方式正是别名的目的。
Ghos3t

我对此别名有一个奇怪的问题,当我这样使用它时,它使用cdls projec2,它将显示项目2文件夹中的所有文件,但实际上不显示到该文件夹​​,而是保留在原始文件夹中。
Ghos3t

2

为cd命令创建别名的常见解决方案并不完美,因为还有其他命令可以更改您的当前目录,例如popd或什至使用cd命令运行脚本。

最好使用$ PROMPT_COMMAND Bash钩子,该钩子在返回提示之前执行命令。

仅在更改目录以减少屏幕噪音时,命令(在我们的情况下为函数)将执行ls。.bashrc的代码:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd


1

在bash中,您无法重命名为需要参数的操作的别名。为此,有功能。所以在你~/.bashrc下面

mycd() {
  cd "$1"
  ls
}


为了允许ls命令使用参数,我使用函数mycd {Builtin cd $ 1 && ls $ 2}。现在您可以调用命令,例如mycd .. -la
Christian Schulzendorff,

@ChristianSchulzendorff:最好使用引号:function mycd { builtin cd "$1" && ls "$2" }
enzotib '16

不起作用,我只是尝试了一下。该文件为空,但是添加代码后,没有任何变化。
黑色

0

将下面的代码放在.profile中,它可以工作。在HP-Unix盒子上测试。

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

更方便-具有追溯历史的能力:

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

更改目录时,Stack: (current_dir) (previous_dir) ...将显示带有:的行,然后ls输出。要返回目录历史,只需弹出以下命令:popd

我添加了,else因此尝试转到错误的目录时会看到错误。


如果你只是做CD -它会带你到你,你是在上迪尔。
伊恩·

0

我认为ls以这种方式启用的选项很好,因为cd没有选项。

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

嗯... cd确实有选择。
库萨兰达

0

这是我发现有用的(在Debian 9上):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

如果该目录中有太多项目,这给了我截断的输出,并带有省略号,以便控制台保持干净:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

这没有添加其他答案尚未涵盖的内容。
jasonwryan '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.