it-swarm.com.de

CD automatisch machen ls

Ich finde, dass ich oft Folgendes mache:

%> cd bla/bla
%> ls

Ich möchte, dass jedes Mal, wenn ich cd in ein Verzeichnis gehe, automatisch ein ls ausgeführt wird.

Ich spielte mit meinem .bashrc für eine Weile, konnte aber nicht herausfinden, wie dies geschehen soll.

51
RobKohr

Sie können dies mit einer Funktion tun:

$ cdls() { cd "[email protected]" && ls; }

Das && bedeutet 'cd für ein Verzeichnis, und wenn dies erfolgreich ist (z. B. das Verzeichnis existiert), führen Sie ls' aus. Verwendung der && Operator ist besser als ein Semikolon ; Operator zwischen den beiden Befehlen, wie bei { cd "[email protected]" ; ls; }. Dieser zweite Befehl führt ls aus, unabhängig davon, ob cd funktioniert hat oder nicht. Wenn cd fehlgeschlagen ist, druckt ls den Inhalt Ihres aktuellen Verzeichnisses, was für den Benutzer verwirrend ist. Verwenden Sie als Best Practice && und nicht ;.

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

Im Allgemeinen ist es eine schlechte Praxis, einen bereits vorhandenen Befehl umzubenennen, insbesondere für einen häufig aufgerufenen Befehl wie cd. Erstellen Sie stattdessen einen neuen Befehl mit einem anderen Namen. Wenn Sie cd mit einer Funktion oder einem Alias ​​überschreiben, der auch cd heißt, was würde passieren, wenn Sie ein Verzeichnis mit 100.000 Dateien eingeben? Es gibt viele Dienstprogramme, die cd verwenden, und sie können durch dieses ungewöhnliche Verhalten verwirrt werden. Wenn Sie ein freigegebenes Konto verwenden (z. B. root, wenn Sie mit anderen Systemadministratoren arbeiten), kann es sehr gefährlich sein, einen vorhandenen Befehl zu ersetzen, da sich die Umgebung von den Erwartungen unterscheidet.

54

Ich habe dies in meiner .bashrc, und es funktioniert gut.

function cd {
    builtin cd "[email protected]" && ls -F
    }

Früher in meinem .bashrc habe ich: [ -z "$PS1" ] && return, und alles nach dieser Zeile gilt nur für interaktive Sitzungen. Dies hat also keinen Einfluss darauf, wie sich cd in Skripten verhält.

42
frabjous

off-Topic, da die Frage mit/bash markiert ist, aber da einige Fragen als Duplikat dieser Frage geschlossen sind, die bash nicht erwähnt:

Mit zsh:

chpwd() ls

Die Funktion chpwd () wird von zsh aufgerufen, wenn sich das aktuelle Verzeichnis ändert (über cd, pushd, popd ...). tcsh hat eine ähnliche Funktion und ist wahrscheinlich der Ursprung von zsh.

16

Warum fügen Sie Ihrer .bashrc-Datei keinen Alias ​​hinzu?

Etwas wie:

alias cdls='cd "[email protected]" && ls'
4
Kenneth Aar

Kopier das:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Jetzt können Sie einfach eine einfache CD machen:

cd / 
(files listed)
cd /home 
(files listed)
etc... 

Die übliche Lösung zum Erstellen eines Alias ​​für den Befehl cd ist nicht perfekt, da es andere Befehle gibt, die Ihr aktuelles Verzeichnis ändern können, z. B. popd oder sogar das Ausführen eines Skripts mit dem Befehl cd.

Es ist besser, den Bash-Hook $ Prompt_COMMAND zu verwenden, der einen Befehl ausführt, bevor eine Eingabeaufforderung zurückgegeben wird.

Der Befehl (in unserem Fall eine Funktion) führt ls nur aus, wenn sich das Verzeichnis geändert hat, um das Bildschirmrauschen zu reduzieren. Code für .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
2
Jack

In bash können Sie keine Aliase für Aktionen verwenden, für die Parameter erforderlich sind. Dafür gibt es Funktionen. Also gib dein ~/.bashrc folgende

mycd() {
  cd "$1"
  ls
}
1
enzotib

Fügen Sie den folgenden Code in das .profile ein und es funktioniert. Getestet auf HP-Unix Box.

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

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

Ich denke, es ist gut, die Optionen von ls auf diese Weise zu aktivieren, da cd keine Option akzeptiert.

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

Noch praktischer - mit der Fähigkeit zurück in die Geschichte:

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

Wenn Sie das Verzeichnis wechseln, wird eine Zeile mit Stack: (current_dir) (previous_dir) ... angezeigt und anschließend ls ausgegeben. Um in den Verzeichnisverlauf zurückzukehren, geben Sie einfach den folgenden Befehl ein: popd.

Ich habe else hinzugefügt, damit beim Versuch, in ein falsches Verzeichnis zu wechseln, ein Fehler angezeigt wird.

0
Ctrl-C

Folgendes finde ich nützlich (unter 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
    '
}

Dies gibt mir eine abgeschnittene Ausgabe mit einer Ellipse, falls sich zu viele Elemente in diesem Verzeichnis befinden, damit die Konsole sauber bleibt:

$ 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
0
Superlexx