【问题标题】:How to only display owner of file when using ls command with special edge case使用具有特殊边缘情况的 ls 命令时如何仅显示文件的所有者
【发布时间】:2021-09-27 14:02:20
【问题描述】:

我的目标是递归查找目录中的所有文件并仅显示文件所有者名称,因此我可以使用 uniq 来计算用户在目录中拥有的文件数。我使用的命令如下:

command = "find " + subdirectory.directoryPath + "/ -type f -exec ls -lh {} + | cut -f 3 -d' ' | sort | uniq -c | sort -n"

此命令成功地仅显示每行文件的所有者,并允许我计算所有者名称重复的 # 次,从而获得他们在子目录中拥有的文件 #。 cut使用''作为分隔符,只保留ls中的第3列,即文件的所有者。

但是,出于我的目的,存在这种特殊的边缘情况,如果发生以下情况,我将无法获取所有者名称。

-rw-r-----  1             31122918 group 20169510233 Mar 17 06:02                                              
-rw-r-----  1 user1                group 20165884490 Mar 25 11:11                                      
-rw-r-----  1 user1                group 20201669165 Mar 31 04:17                                     
-rwxr-x---  1 user3                group 20257297418 Jun  2 13:25             
-rw-r-----  1 user2                group 20048291543 Mar  4 22:04                                          
-rw-r-----  1             14235912 group 20398346003 Mar 10 04:47 

特殊的边缘情况是您在上面看到的所有者的#s。我使用的当前命令可以完美地检测到 user1、user2 和 user3,但是由于数字一直放在右边,所以上面的命令没有检测到数字,并且什么也不显示。示例输出如下所示:

1  
1 user3
1 user2
1
2 user1

谁能帮我解析 ls 输出,以便我在尝试仅打印文件所有者列时能够检测到这些#?

【问题讨论】:

  • 使用awk而不是cut来获取第三个字段。
  • 或者使用stat命令代替ls

标签: linux unix command-line cut ls


【解决方案1】:

cut -d' ' 不会捕获包含前导空格的第三个字段 -- 每个空格都被视为另一个字段的分隔符。

替代方案:

  1. cut -c

     123456789X123456789X123456789X123456789X123456789L0123456789X0123
     -rw-r-----  1             31122918 group 20169510233 Mar 17 06:02
     -rw-r-----  1 user1                group 20165884490 Mar 25 11:11
    

你搜索的数据在每行第 15 到 34 个字符之间,所以你可以说

    cut -c14-39
  1. perl/awk:其他工具擅长从一行中提取数据。试一试

     perl -lane 'print $F[2]'
     awk '{print $3}'
    

【讨论】:

  • 使用 awk 是最有效的解决方案。谢谢!
【解决方案2】:

不要尝试解析ls 的输出。使用stat 命令。

find dirname  ! -user root -type f -exec stat --format=%U {} + | sort | uniq -c | sort -n

%U 打印所有者用户名。

【讨论】:

    【解决方案3】:

    合并多个空间 tr -s ' '

    获取文件用户

    1. ls -hl | tr -s ' ' | cut -f 3 -d' '
    2. ls -hl | awk '{print $3}'

    sudo find ./ ! -user root -type f -exec ls -lh {} + | tr -s ' ' | cut -f 3 -d' ' | sort | uniq -c | sort -n

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2016-08-17
      • 1970-01-01
      • 2016-05-18
      • 2014-08-17
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多