首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的Bash脚本中打印出每个文件的字节大小?

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

Unix & Linux用户
提问于 2018-10-06 20:34:07
回答 2查看 3.1K关注 0票数 2

我目前的代码如下:

scan.sh:

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

输出如下:

代码语言:javascript
复制
./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 :

基本上,我的代码将采用一种语法,并将根据该语法搜索目录。问题是我想要它打印出“文件名”+“文件的字节大小”,只是我似乎无法做到这一点。

EN

回答 2

Unix & Linux用户

发布于 2018-10-06 20:41:33

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

代码语言:javascript
复制
byte=value

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

你可以直接写下来:

代码语言:javascript
复制
#! /bin/sh -
stat -c '%n: %s' -- *."$1"

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

代码语言:javascript
复制
#! /bin/zsh -
for file in *.$1; do
  stat -c '%n: %s' -- $file
done

或者如果您必须使用bash

代码语言:javascript
复制
#! /bin/bash -
shopt -s failglob
for file in *."$1"; do
  stat -c '%n: %s' -- "$file"
done
票数 7
EN

Unix & Linux用户

发布于 2018-10-07 03:42:34

如果您不太关心确切的输出格式,下面是一个简单的方法,它应该与伯恩壳及其后代(包括bash和ksh)一起工作:

代码语言:javascript
复制
$ for file in *; do if [ -f "$file" ] && [ -r "$file" ]; then wc -c "$file"; fi; done
      23 HEAD
     111 config
      73 description

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

代码语言:javascript
复制
$ for file in *; do wc -c $file; done

备注:

  • 如果您使用bash或ksh编写这篇文章,那么最好使用(( ))[[ ]]而不是[ ]。(来源)下面还考虑使用$(wc -c <"$file")而不是`wc -c <"$file"`)。(来源)
  • -f测试看看您所看到的是一个普通文件(不是目录、设备、管道、套接字、tty,或者通常是一些不能用字节表示的奇怪的东西)。-r测试该文件的可读性,即wc有成功的机会;如果您正在查看无法读取的大型文件或文件,请按照原始版本和Stéphane的答案使用stat
  • 如果任何文件中都有空格或制表符(例如,名为"$file"的文件),则必须使用引号( my stuff.txt)。
  • 如果您确实关心确切的格式,您可能应该使用`wc -c <"$file"` (它不会打印文件名)和echoecho -n (它将打印您想要的任何东西)的一些组合。
  • 如果感兴趣的文件是脚本的参数,则在该脚本中使用"$@" (解释)。

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

ls | while IFS= read -r之类的

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

find之类的,-type f -print | while IFS= read -r之类的

或者更好的是:

find之类的,-type f print0 | xargs -o之类的

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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/473687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档