如何在 Bash 脚本中打印出每个文件的字节大小?

如何在 Bash 脚本中打印出每个文件的字节大小?

我当前的代码是这样的:

扫描.sh:

#!/bin/bash
while IFS= read -r line;
do
    byte = $(stat -c%s "$line");
    echo "$line : $byte";
done< <(ls *.$1)

输出将是这样的:

./scan.sh cpp
./scan.sh: line 4: byte: command not found
arraysum.cpp :
./scan.sh: line 4: byte: command not found
countLines.cpp :
./scan.sh: line 4: byte: command not found
createtext.cpp :
./scan.sh: line 4: byte: command not found
multiproc1.cpp :
./scan.sh: line 4: byte: command not found
myWc.cpp :
./scan.sh: line 4: byte: command not found
test.cpp :

基本上我的代码将采用一种语法,并根据该语法搜索目录。问题是我希望它打印出“文件名”+“文件字节大小”,只是我似乎无法正常工作。

答案1

在类似于 Bourne 的 shell 的语法中bash,符号赋值周围不能有任何空格=

byte=value

但在这里,解析 的输出ls是一个坏主意。

你可以这样写:

#! /bin/sh -
stat -c '%n: %s' -- *."$1"

如果确实需要循环,只需编写:

#! /bin/zsh -
for file in *.$1; do
  stat -c '%n: %s' -- $file
done

或者如果你必须使用bash

#! /bin/bash -
shopt -s failglob
for file in *."$1"; do
  stat -c '%n: %s' -- "$file"
done

答案2

这是一个简单的方法来做到这一点,应该与伯恩外壳及其后代(包括 bash 和 ksh),如果您不太关心确切的输出格式:

$ for file in *; do if [ -f "$file" ] && [ -r "$file" ]; then wc -c "$file"; fi; done
      23 HEAD
     111 config
      73 description

如果您也不太关心错误和极端情况(在这种情况下,祝您好运):

$ for file in *; do wc -c $file; done

笔记:

  • 如果您使用 bash 或 ksh 编写此代码,那么最好使用(( ))[[ ]]代替[ ]。 (来源) 另外,下面考虑使用)$(wc -c <"$file")代替`wc -c <"$file"`。 (来源

  • -f测试您正在查看的内容是否是一个普通文件(不是目录、设备、管道、套接字、tty,或者通常是一些不能说具有字节大小的奇怪的东西)。-r测试文件是否可读,即wc有可能成功;如果您正在查看巨大的文件或无法读取的文件,请stat按照您的原始版本和 Stéphane 的答案使用。

  • "$file"如果任何文件中包含空格或制表符(例如,名为 的文件),则需要使用引号 ( ) my stuff.txt

  • 如果您确实关心确切的格式,您可能应该使用`wc -c <"$file"`(不会打印文件名)和echoecho -n(将打印您想要的任何内容)的某种组合。

  • 如果感兴趣的文件是脚本的参数,则在该脚本中使用"$@"(解释)。

ls我同意@stéphane-chazelas 的观点,即你不应该解析;的输出。但如果你这样做了,你就不需要流程替代。您可以更简单地读取命令的输出:

ls | while IFS= read -r 等等等等等等

或者,如果您想递归目录:

find 废话 -type f -print | while IFS= read -r 巴拉巴拉

或者更好的是:

find 废话 -type f print0 | xargs -o 巴拉巴拉

再次-print0正确xargs -0处理带有空格或制表符的文件名

相关内容