it-swarm-id.com

Buat cd secara otomatis ls

Saya menemukan bahwa saya sering melakukan hal berikut:

%> cd bla/bla
%> ls

Saya ingin setiap kali saya cd ke direktori ia secara otomatis melakukan ls.

Saya mengutak-atik .bashrc Saya untuk sementara waktu, tetapi tidak tahu bagaimana cara mewujudkannya.

51
RobKohr

Anda dapat melakukan ini dengan suatu fungsi:

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

&& berarti 'cd ke direktori, dan jika berhasil (mis. direktori ada), jalankan ls'. Menggunakan && operator lebih baik daripada menggunakan titik koma ; operator di antara dua perintah, seperti halnya { cd "[email protected]" ; ls; }. Perintah kedua ini akan menjalankan ls terlepas dari apakah cd bekerja atau tidak. Jika cd gagal, ls akan mencetak isi direktori Anda saat ini, yang akan membingungkan pengguna. Sebagai praktik terbaik, gunakan && dan tidak ;.

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

Secara umum, itu adalah praktik yang buruk untuk mengubah nama perintah yang sudah ada, terutama untuk perintah yang biasa disebut cd. Sebaliknya, buat perintah baru dengan nama yang berbeda. Jika Anda menimpa cd dengan fungsi atau alias yang juga bernama cd, apa yang akan terjadi ketika Anda memasukkan direktori dengan 100.000 file? Ada banyak utilitas yang menggunakan cd, dan mereka mungkin menjadi bingung oleh perilaku yang tidak biasa ini. Jika Anda menggunakan akun bersama (seperti root saat Anda bekerja dengan administrator sistem lain), akan sangat berbahaya untuk mengganti perintah yang ada karena lingkungannya berbeda dari yang diharapkan orang.

54

Saya memilikinya di .bashrc saya, dan berfungsi dengan baik.

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

Sebelumnya di .bashrc saya, saya punya: [ -z "$PS1" ] && return, dan semuanya setelah baris itu hanya berlaku untuk sesi interaktif, jadi ini tidak mempengaruhi bagaimana cd berperilaku dalam skrip.

42
frabjous

di luar topik, karena pertanyaan diberi tag/bash, tetapi karena beberapa pertanyaan ditutup sebagai duplikat dari yang ini tidak menyebutkan bash:

Dengan zsh:

chpwd() ls

Fungsi chpwd () dipanggil oleh zsh setiap kali direktori saat ini berubah (dengan cara cd, pushd, popd ...). tcsh memiliki fitur serupa dan mungkin dari mana zsh mendapatkannya.

16

Mengapa tidak menambahkan alias ke file .bashrc Anda?

Sesuatu seperti:

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

Salin ini:

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

Sekarang Anda hanya dapat melakukan cd sederhana:

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

Solusi umum untuk membuat alias untuk perintah cd tidak sempurna karena ada perintah lain yang dapat mengubah direktori Anda saat ini seperti popd atau bahkan menjalankan skrip dengan perintah cd di dalamnya.

Lebih baik menggunakan $ Prompt_COMMAND Bash hook yang mengeksekusi perintah sebelum mengembalikan Prompt.

Perintah (fungsi dalam kasus kami) akan menjalankan ls hanya jika direktori telah berubah untuk mengurangi kebisingan layar. Kode untuk .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

Di bash, Anda tidak dapat berulang ke alias untuk tindakan yang memerlukan parameter. Untuk ini ada fungsinya. Jadi masukkan ~/.bashrc pengikut

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

Tempatkan kode di bawah ini di profil. Dan itu berfungsi. Diuji pada kotak HP-Unix.

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

Saya pikir itu baik untuk mengaktifkan opsi ls dengan cara ini karena cd tidak mengambil opsi.

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

Lebih berguna - dengan kemampuan untuk kembali dalam sejarah:

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
}

Ketika Anda mengubah direktori, baris dengan: Stack: (current_dir) (previous_dir) ... akan ditampilkan, lalu ls output. Untuk kembali ke histori dirs, cukup pop perintah ini: popd.

Saya menambahkan else sehingga Anda akan melihat kesalahan ketika mencoba masuk ke direktori yang salah.

0
Ctrl-C

Inilah yang menurut saya berguna (pada 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
    '
}

Ini memberi saya output terpotong dengan Ellipsis kalau-kalau ada terlalu banyak item dalam direktori itu sehingga konsol tetap bersih:

$ 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