![创建在给定目录中拥有文件的每个用户的列表以及他们拥有的文件和目录的数量](https://linux22.com/image/117176/%E5%88%9B%E5%BB%BA%E5%9C%A8%E7%BB%99%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%8B%A5%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84%E5%88%97%E8%A1%A8%E4%BB%A5%E5%8F%8A%E4%BB%96%E4%BB%AC%E6%8B%A5%E6%9C%89%E7%9A%84%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95%E7%9A%84%E6%95%B0%E9%87%8F.png)
我无法理解代码:ls -l /projects/ghosttrail | tail -n +2 | sed 's/\s\s*/ /g' | cut -d ' ' -f 3 | sort | uniq -c
。有人能给我详细解释每一步发生的事情吗?我知道我可以通过一一添加每个命令来自己完成,但是代码对我不起作用,而且我无法理解一些事情,例如尾部+2参数的含义,或者我们通过将 sed 命令和为什么我们不采用 cut 命令中的第四列。
答案1
管道的步骤,上一个命令的输出用作下一个命令的输入:
ls -l /projects/ghosttrail
列出目录内容(不以点开头)及其详细信息。tail -n +2
输出从第 2 行开始(删除第一行)。没有+
,tail
将显示最后两行(由 指定的行数-n
,默认 10)。sed 's/\s\s*/ /g'
将多个连续空格替换为单个空格。cut -d ' ' -f 3
获取第三个字段(用户名)。sort | uniq -c
对独特的行进行排序和计数。sort
使用它是因为uniq
不会检测重复的行,除非它们是相邻的,如中所述man uniq
。
使用 GNU 获得相同结果的另一种方法find
:
find . -maxdepth 1 -not -name '.*' -printf '%u\n' | sort | uniq
find
-printf '%u\n'
列出工作目录中的用户名(选项)。-maxdepth 1
防止搜索子目录。-not -name '.*'
不包括点文件。sort | uniq
与原始示例具有相同的目的。