保存在文本文件列表中,其中包含每个文件的大小

保存在文本文件列表中,其中包含每个文件的大小

我正在尝试将所有文​​件的列表(包括大小)保存在文本文件中。

使用该命令find *> yourfilename.csv我只能导出文件的名称。

我怎样才能添加文件大小?

答案1

使用bashLinux 上的 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

对于bashOpenBSD(或具有类似实现的其他一些 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

  1. 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 文件,您也可以将其替换为您喜欢的分隔符。)

相关内容