ファイルまたはディレクトリ行が長すぎる場合は、lsリスト形式にアップグレードしますか?

ファイルまたはディレクトリ行が長すぎる場合は、lsリスト形式にアップグレードしますか?

私ができる方法はありますか?たとえば、aが次のような長い名前を取得する場合:

i-have-names-that-are-too-long-to-describe/
i-have-names-that-are-too-long-to-describe-2/
i-have-names-that-are-too-long-to-descri-3/

lsls -lマイファイルまたはディレクトリ名が20文字を超える場合からアップグレードできますか?

.bashrcこれを行うために私のbash機能を設定する方法はありますか?生成された関数lls()を呼び出します。

@tripleeeが質問しました。

ls -l入力ファイル名が長すぎるときに使用しますか?なぜ?出力を短くするのではなく、長くします。長いファイル名と短いファイル名が混在している場合はどうすればよいですか?

長いファイル名を読むことがリストに整理されていることをお勧めします(固定列をより簡単に消化して読み取ることができます)。長いファイル名と短いファイル名が混在している場合は、デフォルトでリスト形式を使用します。

答え1

あなたの要件を満たす組み込みオプションはありませんls。出力を解析した後に「長い」ファイル名が見つかった場合は、再起動するか、次の操作を行う必要があります。

$ ls ??????????* >& /dev/null && ls -l || ls

?長さ制限を好きなだけ入力してください。エイリアスとして設定できます。)

ただ使ってみるのはどうですかls -1? (小文字のLではなくaです。)常に1列にファイルを一覧表示します。 (または単一列ディスプレイに接続することも、またはパイプlsで接続します。)またはで使用します。morelessfind-maxdepth 1

答え2

if [ $(ls "$@" | ( max=0; while read l ; do len=${#l} ; [[ $max -lt $len ]] && max=$len; done; echo $max )) -gt 20 ]
then
    ls "$@"
else
    ls -l "$@"
fi

あるいは、manatworkの提案のおかげで、この簡単なアプローチではGNU wcを使用できると仮定します。

[[ $(ls "$@" | wc -L) -gt 20 ]] && ls "$@" || ls -l "$@"

答え3

私が望むものに対する私の独立した試みは次のとおりです。

lls(){
  opt="   "      
  for i in $(ls -l | tr -s " " | cut -d' ' -f9)  
  do   
    count=$(echo $i | wc -m)  
     if [ $count -gt 20 ] ; then    
       opt=" -l"; break;           
     fi    
  done  
  ls $opt
}

私は.bashrcに入れました。ただし、これにはtr、cut、wcを使用する必要があります。

関連情報