在特殊边缘情况下使用 ls 命令时如何仅显示文件所有者
How to only display owner of file when using ls command with special edge case
我的 objective 是递归查找目录中的所有文件并仅显示文件所有者名称,因此我能够使用 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 输出,以便我在尝试仅打印文件所有者列时能够检测到这些#吗?
cut -d' '
不会捕获包含前导 space 的第三个字段——每个 space 都被视为另一个字段的分隔符。
备选方案:
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
perl/awk:其他工具擅长从一行中提取数据。尝试其中之一
perl -lane 'print $F[2]'
awk '{print }'
不要尝试解析 ls
的输出。使用 stat
命令。
find dirname ! -user root -type f -exec stat --format=%U {} + | sort | uniq -c | sort -n
%U
打印所有者用户名。
合并多个空间
tr -s ' '
获取文件用户
ls -hl | tr -s ' ' | cut -f 3 -d' '
ls -hl | awk '{print }'
sudo find ./ ! -user root -type f -exec ls -lh {} + | tr -s ' ' | cut -f 3 -d' ' | sort | uniq -c | sort -n
我的 objective 是递归查找目录中的所有文件并仅显示文件所有者名称,因此我能够使用 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 输出,以便我在尝试仅打印文件所有者列时能够检测到这些#吗?
cut -d' '
不会捕获包含前导 space 的第三个字段——每个 space 都被视为另一个字段的分隔符。
备选方案:
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
perl/awk:其他工具擅长从一行中提取数据。尝试其中之一
perl -lane 'print $F[2]' awk '{print }'
不要尝试解析 ls
的输出。使用 stat
命令。
find dirname ! -user root -type f -exec stat --format=%U {} + | sort | uniq -c | sort -n
%U
打印所有者用户名。
合并多个空间
tr -s ' '
获取文件用户
ls -hl | tr -s ' ' | cut -f 3 -d' '
ls -hl | awk '{print }'
sudo find ./ ! -user root -type f -exec ls -lh {} + | tr -s ' ' | cut -f 3 -d' ' | sort | uniq -c | sort -n