![使用 bash](https://linux22.com/image/1155581/%E4%BD%BF%E7%94%A8%20bash.png)
我需要从硬盘中获取所有文件(隐藏和可见)的文本列表,包括子文件夹。理想情况下,列表应包含文件名、路径、大小和创建(或上次修改)日期(如果可能)。有人能告诉我需要什么命令吗?此外,是否可以将其创建为文件.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
部分。