我需要从硬盘驱动器中获取所有文件(隐藏和可见)的文本列表,包括子文件夹。理想情况下,如果可能,列表应包含文件名、路径、大小和创建(或上次修改)日期。有人可以告诉我我需要什么命令吗?另外,是否可以将其创建为.csv
文件或类似的东西以在 Excel 中使用?
我对 Ubuntu 不是特别精通,因此对每个命令项的解释也将不胜感激。
假设有问题的磁盘安装在/media/disk1
:
$ shopt -s globstar dotglob
$ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv
Run Code Online (Sandbox Code Playgroud)
shopt -s globstar dotglob
打开 bash 的递归通配功能(启用“**”,请参阅https://unix.stackexchange.com/questions/49913/recursive-glob)。它还打开以 a 开头的文件的匹配,也.
称为隐藏文件。
stat
是用于获取文件元数据的程序。基本上这个程序将针对磁盘上的每个文件运行。
-c '"%n",%s,%y'
指定stat命令的输出格式。%n
是文件名,用双引号括起来,%s
是文件大小,%y
是最后修改时间。(见stat --help
)
/media/disk1/**/*
告诉 bash 将在该路径下递归找到的所有文件名传递给 pogram (stat),对于普通文件和隐藏文件,因为启用了 dotglob。
>disk1.csv
将输出重定向到名为disk1.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
[...]
Run Code Online (Sandbox Code Playgroud)
我测试将生成的 csv 导入 libreoffice calc 并且它工作得很好,还有有趣的文件名和换行符。它可能会被带有双引号的文件名阻塞。
如果文件总数过高或所有文件名中的字符总数过高,上述命令将失败。对于小型驱动器(USB 拇指驱动器等),它应该足够了,但是如果您正在索引包含数百万个文件的大磁盘,您可能会达到该限制。
您可以改为运行以下命令,它将产生相同的输出(并且占用更少的内存):
find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv
Run Code Online (Sandbox Code Playgroud)
对于“find .. -print0 | xargs -0 ..”模式,您会在这里找到很多答案,例如“xargs”和命令替换之间的区别?