我当前的代码是这样的:
扫描.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"`
(不会打印文件名)和echo
或echo -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
处理带有空格或制表符的文件名