linux 用于获取目录的文件计数的Shell脚本

mpbci0fu  于 2023-03-07  发布在  Linux
关注(0)|答案(1)|浏览(131)

我正在尝试创建一个shell脚本,它将获取静态目录中的文件数,然后在一个表中显示目录和它包含的文件数。
包含目录静态路径的文件。该文件名为dirs.txt。这些路径的格式为. /path/to/file.txt
下面是我正在运行的脚本:

#! /bin/bash

files=$(wc -l)

while read dir; do
print_table() {
  perl -MText::ASCIITable -e '
    $t = Text::ASCIITable->new({drawRowLine => 1});
    while (defined($c = shift @ARGV) and $c ne "--") {
      push @header, $c;
      $cols++
    }
    $t->setCols(@header);
    $rows = @ARGV / $cols;
    for ($i = 0; $i < $rows; $i++) {
      for ($j = 0; $j < $cols; $j++) {
        $cell[$i][$j] = $ARGV[$j * $rows + $i]
      }
    }
    $t->addRow(\@cell);
    print $t' -- "$dir"
}

print_table Directory    'Files Created' -- \
            $dir "${files}"

done < dirs.txt

我想做一个“foreach”,以便所有的文件夹路径可以添加到同一个表与各自的文件计数。
问题是,当我运行这个时,它只是挂起。如果我作为变量单独输入目录,并删除“for”“do”,那么它就能工作。

hmae6n7t

hmae6n7t1#

原始代码中存在一些问题。请尝试以下代码片段以查看是否有帮助:
稍后会解释-如果您想确认或提问。

*$files未使用wc -l命令的输出进行初始化。

应更新为类似files=$(find $dir -type f | wc -l)的值,以计算目录中的文件数。

  • print_table* 函数是在while循环中定义的,这意味着它在每次迭代中都被重新定义。2它应该把函数定义移到循环之外。
  • 没有使用正确的参数调用 print_table 函数。它将整个$files变量作为单个参数传递,这不是该函数所期望的。您应该将当前目录的$files值作为单独的参数传递。
#!/bin/bash

print_table() {
  perl -MText::ASCIITable -e '
    $t = Text::ASCIITable->new({drawRowLine => 1});
    while (defined($c = shift @ARGV) and $c ne "--") {
      push @header, $c;
      $cols++
    }
    $t->setCols(@header);
    $rows = @ARGV / $cols;
    for ($i = 0; $i < $rows; $i++) {
      for ($j = 0; $j < $cols; $j++) {
        $cell[$i][$j] = $ARGV[$j * $rows + $i]
      }
    }
    $t->addRow(\@cell);
    print $t' "$@"
}

while read dir; do
  files=$(find "$dir" -type f | wc -l)
  print_table "$dir" "Files Created" "$files"
done < dirs.txt

相关问题