首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix中ls -lsh中的“总计”

Unix中ls -lsh中的“总计”
EN

Stack Overflow用户
提问于 2015-04-02 20:21:37
回答 4查看 672关注 0票数 0

我试图使用ls -lsh命令只将文件大小输出到文件中。但它也显示了总数。我需要这样的东西:

。./sample.txt 4.0K

./multisample.txt 4.0K

,但它显示如下

。./test.txt ./multitest.txt

4.0K

4.0K

.:

合计

4.0K

4.0K

4.0K

我使用的命令有: ls -lsh $LISTNAME \awk '{print $1}‘>> /home/test/$date.log

其中$LISTNAME包含文件名。

请让我知道如何只显示文件大小和我需要的格式(文件name1 选项卡文件大小和下一行filename2 选项卡文件大小)

EN

回答 4

Stack Overflow用户

发布于 2015-04-02 20:30:12

ls

尽管它为您提供了字节大小,但最好的方法是:

代码语言:javascript
复制
# this assumes your filenames don't contain whitespace
stat -c $'%n\t%s' $LISTNAME

如果$LISTNAME是以换行符分隔的文件列表,这将容纳文件名中的空格和/或制表符,而不是换行符。假设bash (我认为第4版)

代码语言:javascript
复制
mapfile -t files <<<"$LISTNAME"
stat -c $'%n\t%s' "${files[@]}"
票数 3
EN

Stack Overflow用户

发布于 2015-04-02 20:29:16

如果您理解并接受如果任何文件名包含任何空格字符,这将导致中断,则此命令将执行您试图执行的操作:

代码语言:javascript
复制
ls -1sh | awk '!/^total / { print $2 "\t" $1 }'

如果您需要处理包含空格的文件名,那么编写一个使用OS原语列出目录并获取每个文件大小的perl或python脚本可能会更愉快。

票数 0
EN

Stack Overflow用户

发布于 2015-04-02 21:01:12

假设bash (非/bin/sh)和GNU du

代码语言:javascript
复制
# Collect a list of files (not directories, to prevent recursion)
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,所以它将用空格、制表符甚至换行符以明确的、安全的形式编写文件名。例如:

代码语言:javascript
复制
CHECKSUMS       4.0K
exit-trap       4.0K
$'file with a tab here:\t and a newline here:\n'        1.0K

相反,您想要逐字逐句地编写这些字符(对明确解析文件内容的能力有明显的影响),只需用一个...if替换%q即可。

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

https://stackoverflow.com/questions/29421768

复制
相关文章

相似问题

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