「すべて表示可能性? (yまたはn)"はlsコマンドを表します。

「すべて表示可能性? (yまたはn)

bashプロンプトでファイル名全体をタップしようとすると、出力は多くの(> 100)ファイル名になり、シェルは次のように尋ねます。Display all <num> possibilities? (y or n)

ls通常のコマンドを使用してこの動作を複製できますか?

400,000を超えるファイルを含むディレクトリがあります。誤ってlsこのディレクトリにアクセスすると、シェルが長時間応答しなくなり、出力がこぼれる可能性があります。Ctrl-C洪水は止まらない。

ベストアンサー1

私の解決策は少し重いかもしれませんが、誰が知っていますか?

問題は、これを行うにはファイル数を数える必要があることです。通常、次のように実行されます。

$ ls | wc -l

コンテンツはstdoutの代わりにパイプに書き込まれるため、完了には少し時間がかかります(ターミナルへの書き込みには少し時間がかかります。これは400,000回の呼び出し後に重要になります)。write(2))。それでも時間がかかるかもしれませんが、それでも簡単なテストでこれを達成できます。

#!/bin/bash

LIMIT=1000
n=$(ls "$@" 2>/dev/null | head -n$LIMIT | wc -l)

if [ $n -ge $LIMIT ]; then
    echo "This directory contains more than $LIMIT entries."
    echo -n "Are you sure want to continue? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec ls "$@"
    fi
else
    exec ls "$@"
fi

次に、ファイルにエイリアスを設定し、.bashrc代わりにこのスクリプトを呼び出します/bin/ls

alias ls='/path/to/my_ls.sh --color=auto'

また、正しくchmodedされていることを確認してください。

$ chmod +x /path/to/my_ls.sh

編集する:出力行の後に終了head呼び出しを追加しました。これは時間を節約し、実際にはより良い解決策になります;)ls$LIMITtimeout

私が提案したいもう一つのアプローチは、時間制限を使用することです。 5秒以内に完了しない場合は、停止して確実であるかどうかls尋ねます。以下はサンプルスクリプトです(ただ1つではなく複数のコマンドに有効ですls)。

#!/bin/bash                                                                                                                                                                                

TIMEOUT=5

if [ $# -le 0 ]; then
    echo "Usage: $0 [command]"
    exit 1
fi

# Try it silently for a few seconds...
timeout $TIMEOUT "$@" >/dev/null 2>&1

if [ $? -eq 124 ]; then
    echo -n "Your command failed to run under "$TIMEOUT"s. "
    echo -n "Retry without a timeout? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec "$@"
    fi
else
    exec "$@"
fi

その後、次のエイリアスを設定できます。

alias ls='/path/to/script.sh ls --color=auto'
alias grep='/path/to/script.sh grep --color=auto'
alias cat='/path/to/script.sh cat'

テスト中ですので参考にしてください$? -eq 124..

コマンドがタイムアウトして--preserve-status設定されていない場合は、状態124で終了する。

バラよりtimeout(1)より多くの情報を知りたいです。

おすすめ記事