【问题标题】:Going through each ls line遍历每个 ls 行
【发布时间】:2013-03-27 16:13:07
【问题描述】:

我是 linux 中的 shell 脚本的新手。我希望能够列出我的目录中的文件数、目录中的目录数等等。我决定使用

来完成这项任务
   ls -l | cut -c1-1

所以这样我可以获取每个 ls 命令的第一个字符,然后根据它是什么,保持文件类型的计数,直到列出所有文件。例如,如果我在一个包含一堆文件的文件夹中并从上面执行了剪切命令,它将显示许多“-”权限,表明它是一个文件。

我的问题是,根据上面的命令,我将如何遍历每一行 ls ?如果我在 shell 中从上面输入命令,它只会一次显示所有命令……我想浏览每一行 ls。

谢谢!

目录名为Test,包含

 -rw-r--r--  1 teddy  user  31 27 Mar 10:07 test1.txt
 drwx------  1 teddy  user   9 30 Jan 19:18 tooney
 -rw-r--r--  1 teddy  user  31 27 Mar 10:07 test2.txt
 drwx------  1 teddy  user   9  21 Mar 11:32 dirt

【问题讨论】:

  • 为什么不直接把它输入更多? |更多
  • @MichaelGardner 没有考虑过,但如果它有效,那么为什么不确实:)。你能举个例子吗?谢谢
  • 您能给我们举一两个例子,说明输出应该是什么样子,或者您希望根据列出的目录中的内容发生什么?
  • @NicoleHamilton 当然!已编辑,谢谢!
  • 好的,它包含这 4 个条目,然后……然后呢?您是否在问如何迭代它们,例如,在tcsh 中使用foreach 或在bash 中使用for?我不确定你在问什么。

标签: linux shell


【解决方案1】:

使用findwc 怎么样:

# Find all files in the current directory 
$ find . -maxdepth 1 -type f | wc -l

# Find all directories in the current directory 
$ find . -maxdepth 1 -type d | wc -l

命令wc(word count)可以用来统计字符数、单词数和行数。这里wc -l统计find的结果输出的行数。

【讨论】:

    【解决方案2】:

    使用您的方法,您可以使用uniq 计算总数,例如:

    $ ls -l | cut -c1-1 | sort | uniq -c
        214 -
         13 d
          2 l
          1 t
    

    uniq -c 计算一行连续出现的次数,sort 只是将它们按某种排序顺序排列,以便相同的类型最终放在一起。

    如果您希望这些结果包含在变量中,那么这会更容易:

    dirs=0
    files=0
    
    for name in *
    do
        if [[ -d "$name" ]]
        then
            ((dirs++))
        elif [[ -f "$name" ]]
        then
            ((files++))
        # Possibly other things you want to count ...
        fi
    done
    
    echo "Files: $files"
    echo "Directories: $dirs"
    

    【讨论】:

    • 啊完美。我将如何修改它,例如“有 214 种类型”
    • 我可以把每一行的结果放在一个变量中吗?谢谢会接受任何一种方式
    • 将它们放入变量中是可能的,但比较棘手。如果您想要结果,最好使用 for 循环,我会更新我的答案。
    • 它不一定是一个变量,我只是建议一种方法,但显然它不是最简单的:)循环示例将是完美的,谢谢!
    • 对不起,这可能很明显,但是 name 等于什么?
    【解决方案3】:

    将命令添加到更多将防止它滚动到屏幕之外。

    ls -l | cut -c1-1 | more
    

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多