文件列表命令行(隐藏和子文件夹)
我需要从硬盘驱动器,包含的子文件夹中获取所有文件(隐藏和可见)的文本列表。 理想情况下,如果可能,列表将具有文件名,路径,大小和创建(或最后修改)日期。 有人可以告诉我我需要什么命令吗? 此外,是否可以将其创建为.csv
文件或类似的东西,以便在Excel中使用?
我不是非常精通Ubuntu所以对每个命令项的解释也将非常感激。
随着bash
假设有问题的磁盘安装在/media/disk1
:
$ shopt -s globstar dotglob $ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv
shopt -s globstar dotglob
打开bash的递归globbingfunction(允许使用’**’,请参阅https://unix.stackexchange.com/questions/49913/recursive-glob )。 它还会打开以a开头的文件匹配.
,als称为隐藏文件。
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 [...]
我测试将生成的csv导入到libreoffice calc中,它运行得很好,同时还有带有换行符的搞笑文件名。 它可能会在文件名中加上双引号。
ARG_MAX
如果文件总数太高或者所有文件名中的字符总数太高,则上述命令将失败。 对于小型驱动器(USB拇指驱动器等)来说应该足够了,但是如果要为拥有数百万个文件的大磁盘编制索引,则可能会达到这个限制。
你可以运行以下代码,它将产生相同的输出(并减少内存):
find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv
对于“find .. -print0 | xargs -0 ..”模式,你会在这里找到很多答案,例如“xargs”和命令替换之间的区别?
使用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
ewline。
更多细节,请阅读man find
和-printf format
部分。