当文件或目录的行太长时,升级到 ls list 格式?

当文件或目录的行太长时,升级到 ls list 格式?

我有办法做到这一点吗?例如,如果 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/

ls如果ls -l我的文件或目录名称长度超过 20 个字符,我可以从 升级到 吗?

有没有办法在 my 中设置 bash 函数.bashrc来执行此操作?我将调用生成的函数 lls()。

@tripleee 问道:

ls -l当输入文件名很长时你想要吗?为什么?它会使输出更长,而不是更短。如果您收到长文件名和短文件名的混合怎么办?

我更想要它,以便阅读长文件名被系统化到一个列表(并且更容易让我消化和阅读固定列);对于长文件名和短文件名的混合,我将默认使用列表格式。

答案1

没有内置选项ls可以满足您的要求。您必须解析输出,然后在找到“长”文件名时重新启动,或者执行以下操作:

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

(输入尽可能多的?长度限制。您可以将其设置为别名。)

你为什么不直接使用呢ls -1? (这是一个,而不是小写的 L。)它总是在一列中列出文件。 (或者通过管道连接lsmoreless,这也可以连接到单列显示。)或者find与 一起使用-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。

相关内容