使用 bash

使用 bash

我需要从硬盘中获取所有文件(隐藏和可见)的文本列表,包括子文件夹。理想情况下,列表应包含文件名、路径、大小和创建(或上次修改)日期(如果可能)。有人能告诉我需要什么命令吗?此外,是否可以将其创建为文件.csv或类似文件以在 Excel 中使用?

我对 Ubuntu 不是很精通,因此如果能对每个命令项进行解释我将非常感激。

答案1

使用 bash

假设有问题的磁盘安装在/media/disk1

$ shopt -s globstar dotglob
$ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv

shopt -s globstar dotglob打开 bash 的递归通配符功能(允许使用 '**',参见https://unix.stackexchange.com/questions/49913/recursive-glob)。它还会匹配以 开头的文件.,也称为隐藏文件。

stat是用于获取文件元数据的程序。基本上,此程序将针对磁盘上的每个文件运行。

-c '"%n",%s,%y'指定输出格式统计命令。%n是文件名,用双引号括起来,%s是文件大小,%y是最后修改时间。(见stat --help

/media/disk1/**/*告诉 bash 将该路径下递归找到的所有文件名交给 pogram (stat),包括普通文件和隐藏文件,因为 dotglob 已启用。

>disk1.csv输出重定向到名为磁盘1.csv

例如,对于我家来说,disk1.csv 中的输出将如下所示:

$ stat -c '"%n",%s,%y' /home/seb/**/*
"/home/seb/111",82,2018-03-26 18:38:04.048099912 +0200
"/home/seb/app",4096,2017-07-13 23:39:06.509862769 +0200
"/home/seb/Applications",4096,2018-03-14 20:20:48.552005660 +0100
"/home/seb/Applications/arduino-1.8.2",4096,2017-05-29 20:45:01.184017517 +0200
"/home/seb/Applications/arduino-1.8.2/arduino",946,2017-03-22 13:32:41.000000000 +0100
[...]

我测试将生成的 csv 导入 libreoffice calc,效果很好,即使文件名中有换行符,效果也很好。如果文件名中有双引号,它可能会卡住。

最大参数

如果文件总数过多或所有文件名的字符总数过多,上述命令将失败。对于小型驱动器(USB 拇指驱动器等),这应该足够了,但如果您要索引包含数百万个文件的大型磁盘,则可能会达到该限制。

您可以运行以下命令,它将产生相同的输出(并且消耗更少的内存):

find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv

对于“find .. -print0 | xargs -0 ..”模式,您会在这里找到很多答案,例如“xargs”和命令替换之间的区别?

答案2

GNU寻找:

find /path/to -type f -printf '%f,%h/,%s,%TD %Tr\n' > all-files.csv
  • 返回%f文件的名称,其中删除了所有前导目录(仅最后一个元素)。
  • %h返回文件名称的前导目录(除最后一个元素之外的所有内容)。
  • 返回%s文件的大小(以字节为单位)。
  • %Tk̲以 k̲ 指定的格式返回文件的最后修改时间;因此

    • 返回%TD文件的最后修改时间,格式为mm/dd/yy
    • 返回%Tr文件最后修改时间的格式time, 12-hour (hh:mm:ss [AP]M)
  • /,分别\n打印斜线字符、逗号和\n换行符。

更多详细信息,请阅读man find-printf format部分。

相关内容