'总'在Unix中的ls -lsh中

时间:2015-04-02 20:21:37

标签: linux bash unix awk ls

我正在尝试使用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包含文件名。
请告诉我如何仅显示文件大小以及我需要的格式(文件名1 标签文件大小,并在下一行文件名标签文件大小)

4 个答案:

答案 0 :(得分:3)

Don't parse ls

最好的方法是,虽然它给你的字节大小是:

# this assumes your filenames don't contain whitespace
stat -c $'%n\t%s' $LISTNAME

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

mapfile -t files <<<"$LISTNAME"
stat -c $'%n\t%s' "${files[@]}"

答案 1 :(得分:0)

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

ls -1sh | awk '!/^total / { print $2 "\t" $1 }'

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

答案 2 :(得分:0)

假设bash(不是/bin/sh)和GNU du

# 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,所以它将以明确的,评估安全的形式编写带有空格,制表符或甚至换行符的文件名。例如:

CHECKSUMS       4.0K
exit-trap       4.0K
$'file with a tab here:\t and a newline here:\n'        1.0K

...如果您希望按字面意思编写这些字符(明显影响明确解析文件内容的能力),只需将%q替换为%s

答案 3 :(得分:-1)

试试这个:

ls -lh | awk '{print $9 "\t" $5}'