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

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

これを実行する方法はありますか? たとえば、次のような長い名前が付けられたとします。

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/

lsたとえばls -l、20 文字を超えるファイル名またはディレクトリ名がある場合、から に「アップグレード」できますか?

これを実行するために bash 関数を設定する方法はありますか.bashrc? 結果の関数を lls() と呼びます。

@tripleee さんが質問しました:

入力ファイル名が長い場合は、必要ですls -lか? なぜですか? 出力は短くなるのではなく長くなります。長いファイル名と短いファイル名が混在している場合はどうなりますか?

長いファイル名の読み取りがリストに体系化される (固定列で読みやすくなる) ようにしたいのですが、長いファイル名と短いファイル名が混在する場合は、デフォルトでリスト形式にします。

答え1

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

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

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

単に を使用しないでくださいls -1(これは 1 であり、小文字の L ではありません)。 常に 1 列にファイルがリストされます。 (またはまたはlsにパイプすると、これも 1 列表示になります)。または をと共に使用します。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 を使用する必要があります。

関連情報