![保存在文本文件列表中,其中包含每个文件的大小](https://linux22.com/image/165755/%E4%BF%9D%E5%AD%98%E5%9C%A8%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E4%B8%AD%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%A7%E5%B0%8F.png)
我正在尝试将所有文件的列表(包括大小)保存在文本文件中。
使用该命令find *> yourfilename.csv
我只能导出文件的名称。
我怎样才能添加文件大小?
答案1
使用bash
Linux 上的 shell(或具有兼容实现的系统stat
):
shopt -s globstar dotglob nullglob
for pathname in ./**/*; do
if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
stat -c $'%s\t%n' "$pathname"
fi
done >outfile.csv
对于bash
OpenBSD(或具有类似实现的其他一些 BSD 系统stat
),使用
shopt -s globstar dotglob nullglob
for pathname in ./**/*; do
if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
stat -f '%z%t%N' "$pathname"
fi
done >outfile.csv
这两个都会迭代当前目录中或当前目录下的所有名称。对于每个常规文件,stat
调用并显示文件大小(以字节为单位),并打印文件路径名,中间带有制表符。
仅使用zsh
外壳:
zmodload -F zsh/stat b:zstat
zstat -n +size ./**/*(D.)
这使得内置zstat
命令在 shell 中可用,然后使用它来获取当前目录中或当前目录下的每个常规文件(包括具有隐藏名称的文件)的路径名和表观文件大小(以字节为单位)。
对于仅包含几个小文件的浅目录,输出可能如下所示:
./file1 136
./file2 136
./somedir/file3 136
...所以不太像 CSV。
这也可以在一个简单的循环中完成,这将使我们能够更精确地格式化它:
zstat -L -A data -n +size ./**/*(D.)
for name size in $data; do
printf '%s\t%s\n' $size $name
done >outfile.csv
这将调用zstat
当前目录中或当前目录下的所有常规文件,将结果存储在 array 中data
,然后循环遍历该数组的条目(将是交替的路径名和文件大小)。对于每个路径名/大小对,首先打印大小(以字节为单位),然后是制表符和路径名。这里,输出被放入outfile.csv
当前目录中。
一个缩短的版本,摆脱了循环,但以更晦涩的代码支付它(除非您熟悉printf
格式字符串):
zstat -L -A data -n +size ./**/*(D.)
printf '%2$s\t%1$s\n' $data >outfile.csv
该printf
格式%2$s\t%1$s\n
指定两个参数应以字符串形式输出,但顺序相反(数组data
按该顺序存储路径名和文件大小对),并在它们之间有一个制表符。该格式将重复用于每对路径名和文件大小,直到data
数组耗尽。
上述变体均不考虑包含制表符或换行符的 CSV 引用路径名。
答案2
假设您希望 CSV 文件以逗号分隔,并且所有文件名都不包含双引号、逗号或换行符,使用 的 GNU 实现find
,请尝试:
find -printf "%p,%s\n" >filename.csv
答案3
这可以使用以下方法完成ls
:
ls -l > output
- 这将保存文件内的目录列表(包括大小)output
,如下所示:
total 4
-rw-r--r-- 1 ashleyprimo ashleyprimo 124 Jan 4 20:01 test1
-rw-r--r-- 1 ashleyprimo ashleyprimo 0 Jan 4 19:56 test2
-rw-r--r-- 1 ashleyprimo ashleyprimo 0 Jan 4 19:56 test3
-rw-r--r-- 1 ashleyprimo ashleyprimo 0 Jan 4 19:56 test5
您可以添加-a
包含隐藏文件(例如前面带有 . 的文件);并且您可以添加 a-h
以使大小输出“人类可读” - (例如以 MB、GB 等显示,而不是如上所示的字节)
如果您确实想要当前目录文件的简单大小输出,那么您可以使用:ls -lh | grep -vE "total|\." | awk {'print $5 " " $9'} > output
它将输出如下:
124 test1
0 test2
0 test3
0 test5
答案4
您可以使用-ls
查找选项:
find /dir -ls >filename.csv
但是,这将打印更多信息,而不仅仅是文件名和大小。
或者,您可以find
结合使用stat
:
find /dir -exec printf '%s,' {} \; -exec stat -f %z {} \; >filename.csv
这将打印文件名和以字节为单位的大小,并用逗号分隔(因为您要输出到 csv 文件,您也可以将其替换为您喜欢的分隔符。)