LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 883|回复: 8

找出本目录下文件名最长的shell script

[复制链接]
发表于 2004-6-26 00:19:36 | 显示全部楼层 |阅读模式
这个题目是我从一个bbs上看到的,当时贴了许多答案,现在大家也来试试

目的:找出当前目录下文件名最长的文件
需注意的:
1. 文件名可能会有空格
2. 可能会有多过一个的最长的文件名
3. 不要忘了隐藏文件
4. 可能还有需注意的,大家来补充
 楼主| 发表于 2004-6-26 00:21:13 | 显示全部楼层
先来一个吧,这是我的代码:

#!/bin/bash

i=0
max=0
for tmp in .[^.]* *; do
    name[$i]=$tmp
    len[$i]=${#tmp}
    ((i++))
    if [ ${#tmp} -gt $max ]; then
        max=${#tmp}
    fi
done

i=0
for num in "${len[@]}"; do
    if [ $num -eq $max ]; then
        echo "${name[$i]}"
    fi
    ((i++))
done
发表于 2004-6-26 00:47:53 | 显示全部楼层

  1. for i in $(ls -a);do echo $i ${#i};done|sort -k2nr|awk 'NR==1{print $1}'
复制代码
发表于 2004-6-26 01:24:33 | 显示全部楼层

  1. find . -type f -maxdepth 1 | sed 's/\.\/\(.*\)/\1/g'|awk '{print length}' | sort -nr | head -1
复制代码

lee兄的有点小bug, 就是如果有空格的filename, 程序的结果就错了.
发表于 2004-6-26 01:34:36 | 显示全部楼层

  1. find . -type f -maxdepth 1 | awk '{print length, $0}' | sort -k1nr | head -1
复制代码

这个应该比较正确了.
发表于 2004-6-26 01:55:08 | 显示全部楼层
最初由 yongjian 发表

  1. find . -type f -maxdepth 1 | sed 's/\.\/\(.*\)/\1/g'|awk '{print length}' | sort -nr | head -1
复制代码

lee兄的有点小bug, 就是如果有空格的filename, 程序的结果就错了.

谢谢兄弟指点 :thank

  1. /home/lee #cat len
  2. ls -a --quoting-style=c|while read i;do echo "$i:${#i}";done|sort -k2nr -t":"|awk -F: 'NR==1{print $1}'
复制代码

附测试结果:

  1. /home/lee/test #ls -al
  2. 总用量 28
  3. drwxr-xr-x    2 lee      lee          4096  6月 26 01:53 .
  4. drwx------   27 lee      lee          4096  6月 26 01:27 ..
  5. -rw-r--r--    1 lee      lee             0  6月 26 01:29 a
  6. -rw-r--r--    1 lee      lee             0  6月 26 01:50 .a
  7. -rw-r--r--    1 lee      lee             0  6月 26 01:29 a dddddddddddddddddddddddddddddddddd ddddddddd[color=red]
  8. -rw-r--r--    1 lee      lee             0  6月 26 01:50 .a ddddddddddddddddddddddddddddddddddddddddddddddd d[/color]
  9. -rw-r--r--    1 lee      lee             0  6月 26 01:29 b
  10. -rw-r--r--    1 lee      lee             0  6月 26 01:29 ccccccccccccccccccc
  11. -rw-r--r--    1 lee      lee             0  6月 26 01:50 d
  12. -rw-r--r--    1 lee      lee             0  6月 26 01:50 ddd?
  13. -rw-r--r--    1 lee      lee             0  6月 26 01:50 dddddddddddddddddddd
  14. -rw-r--r--    1 lee      lee           206  6月 26 01:53 f
  15. -rw-r--r--    1 lee      lee           204  6月 26 01:52 f~
  16. -rw-------    1 lee      lee         12288  6月 26 01:53 .f.swp
  17. -rw-r--r--    1 lee      lee             0  6月 26 01:35 .sdfsdfsdf
  18. /home/lee/test #ksh len[color=red]
  19. ".a ddddddddddddddddddddddddddddddddddddddddddddddd d"
  20. [/color]
复制代码
 楼主| 发表于 2004-6-26 13:48:52 | 显示全部楼层
你只打印出了一个,可是如果有两个以上的最长的呢
发表于 2004-6-27 14:30:16 | 显示全部楼层
其实, 做出上面的结果,剩下的就已经不难了. 简单的话, 可以这样:

  1. j=0;while read i n; do [[ $i -ge $j ]] && j=$i && echo $n;done < <(find . -type f -maxdepth 1 | awk '{print length, $0}' | sort -k1nr)
复制代码
发表于 2004-6-27 14:44:37 | 显示全部楼层
其实, 做出上面的结果,剩下的就已经不难了.

对呵呵呵呵~~ :thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表