web-dev-qa-db-ja.com

CDを自動的にLSにする

私はしばしば次のことをすることがわかりました。

%> cd bla/bla
%> ls

cdをディレクトリに入れると、自動的にlsが実行されるようにしてください。

しばらく.bashrcをいじっていましたが、どうすれば実現できるのかわかりませんでした。

51
RobKohr

これは関数で行うことができます:

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

&&は 'cdをディレクトリに変換し、成功した場合(たとえば、ディレクトリが存在する場合)ls'を実行します。 &&のように、2つのコマンドの間にセミコロン;演算子を使用するよりも、{ cd "$@" ; ls; }演算子を使用する方が適切です。この2番目のコマンドは、lsが機能したかどうかに関係なく、cdを実行します。 cdが失敗した場合、lsは現在のディレクトリの内容を出力するため、ユーザーを混乱させる可能性があります。ベストプラクティスとして、&&ではなく;を使用してください。

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

一般に、特にcdのような一般に呼び出されるコマンドの場合は特に、既存のコマンドの名前を変更することはお勧めできません。代わりに、別の名前で新しいコマンドを作成してください。 cdcdという名前の関数またはエイリアスで上書きすると、100,000ファイルのディレクトリに入るとどうなりますか? cdを使用する多くのユーティリティがあり、この異常な動作によって混乱する可能性があります。共有アカウント(rootなど、他のシステム管理者と共同で作業している場合)を使用する場合、環境が予想と異なるため、既存のコマンドを置き換えるのは非常に危険です。

54

私はこれを.bashrcに入れており、正常に動作します。

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

私の.bashrcの前のほうで:[ -z "$PS1" ] && return、およびその行以降はすべてインタラクティブセッションにのみ適用されるため、これはスクリプトでのcdの動作には影響しません。

42
frabjous

質問は/ bashとタグ付けされているのでトピック外ですが、bashについて言及していないいくつかの質問はこの質問の複製として閉じられています。

Zshの場合:

chpwd() ls

Chpwd()関数は、現在のディレクトリが(cd、pushd、popd ...によって)変更されるたびにzshによって呼び出されます。 tcshにも同様の機能があり、おそらくzshがそれを取得した場所です。

16

.bashrcファイルにエイリアスを追加してみませんか?

何かのようなもの:

alias cdls='cd "$@" && ls'
4
Kenneth Aar

これをコピー:

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

これで、単純なcdを実行できます。

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

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
2
Jack

Bashでは、パラメーターを必要とするアクションのエイリアスに繰り返しアクセスすることはできません。このための機能があります。だからあなたの~/.bashrc 以下

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

以下のコードを.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
user196161

lsはオプションを取らないので、このようにcdのオプションを有効にするとよいと思います。

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

さらに便利-履歴に戻る機能があります

_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が出力されます。 dirs履歴に戻るには、次のコマンドをポップするだけです:popd

elseを追加したので、間違ったディレクトリに移動しようとするとエラーが表示されます。

0
Ctrl-C

これが私が(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
0
Superlexx