我试图使用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 选项卡文件大小)
发布于 2015-04-02 20:30:12
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[@]}"发布于 2015-04-02 20:29:16
如果您理解并接受如果任何文件名包含任何空格字符,这将导致中断,则此命令将执行您试图执行的操作:
ls -1sh | awk '!/^total / { print $2 "\t" $1 }'如果您需要处理包含空格的文件名,那么编写一个使用OS原语列出目录并获取每个文件大小的perl或python脚本可能会更愉快。
发布于 2015-04-02 21:01:12
假设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相反,您想要逐字逐句地编写这些字符(对明确解析文件内容的能力有明显的影响),只需用一个...if替换%q即可。
https://stackoverflow.com/questions/29421768
复制相似问题