作者:穆羽默然 | 来源:互联网 | 2024-12-15 09:42
我正尝试使用ls -lsh
命令仅将文件大小输出到文件中,但该命令还会显示总的大小信息。我希望输出的结果类似这样:
期望输出:
./sample.txt 4.0K
./multisample.txt 4.0K
然而,实际输出却是:
total 8.0K
./test.txt 4.0K
./multitest.txt 4.0K
为了达到预期的输出格式,即每行显示一个文件名及其对应的文件大小(以制表符分隔),您可以尝试以下几种方法:
解决方案
#1 使用stat
命令
最直接的方法之一是使用stat
命令,它可以提供文件的详细信息,包括大小。此方法返回的是字节单位的文件大小:
stat -c '%n %s' $LISTNAME
这里,$LISTNAME
是一个包含文件名列表的变量。如果文件名中可能包含空格或制表符,但不含换行符,可以使用以下方式处理:
mapfile -t files <<<"$LISTNAME"
stat -c '%n %s' "${files[@]}"
这种方法适用于Bash shell,尤其是版本4及以上。
#2 使用awk
过滤输出
如果您的文件名中不会包含空格等特殊字符,可以通过awk
命令来过滤掉total
行:
ls -1sh | awk '!/^total / { print $2 "\t" $1 }'
对于包含空格或其他特殊字符的文件名,建议使用Perl或Python脚本来实现更精确的控制。
#3 利用du
命令
假设使用Bash且文件系统支持GNU工具,可以结合du
命令来获取文件大小:
files=(); for f in *; do [[ -f "$f" ]] && files+=("$f"); done
while IFS= read -r -d '' line; do
filename=${line#*"$'\t'"}
size=${line%%"$'\t'*"}
printf '%q\t%s\n' "$filename" "$size"
done <<(du -0sh --apparent-size "${files[@]}")
上述脚本使用printf %q
确保即使文件名中含有空格、制表符或换行符,也能正确输出。若需直接输出这些字符,可将%q
替换为%s
。
#4 简单的ls
与awk
组合
最后,如果您只需要一个简单的解决方案,可以尝试:
ls -lh | awk '{print $9 "\t" $5}'
以上方法均能帮助您实现仅输出文件大小的目标,选择适合您具体需求的一种即可。