我正在尝试使用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 标签文件大小,并在下一行文件名标签文件大小)
答案 0 :(得分:3)
最好的方法是,虽然它给你的字节大小是:
# 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}'