我使用的是 Mac,恐怕这个命令行问题让我难住了。至少我假设最简单的方法是通过 CL。
我想在目录树中递归搜索指定扩展名集中的文件(例如 .mov、.mkv、.flv 等视频,...)。然后,我想输出 CSV 格式,其中每行包含文件名(删除路径)和创建日期。
看起来这确实应该可以从命令行完成,或者最多是一个简单的脚本,但我很困惑。
答案1
MacOS 会跟踪文件的创建时间,但没有多少工具可以使用它,而且它通常没有任何意义。对于大多数用途,修改时间效果很好,并且有更多工具支持。
请注意,我的所有解决方案都假设文件名不包含任何字符,
或"
换行符。否则输出是不明确的;要在 CSV 文件中表示这些字符,需要格外小心。如果您的文件名可能包含逗号,您可能需要在文件名两边加上双引号,或使用其他字符,例如;
列分隔符。
zsh,修改时间
要枚举所需的文件,请使用全局运算符 **
遍历子目录并(…|…)
匹配多个扩展名。使用全局限定符 .
将匹配限制为常规文件,N
如果没有匹配则不会出错,并且可以选择D
包含点文件。或者,使用通配标志 i
不区分大小写地匹配扩展名。
要获取所需的数据,请使用zstat
从模块内置zsh/stat
。要打印不带目录部分的文件名,请使用历史修改器 t
固定到一个参数扩展。
zmodload -F zsh/stat b:zstat
for x in **/*.(#i)(mov|mkv|flv)(.N); do
TZ=UTC zstat -A a -F '%Y-%m-%d %H:%M:%S' +mtime -- $x;
print -lr -- "$x:t,$a[1]";
done
zsh + /usr/bin/stat
,创建时间
使用系统stat
实用程序而不是zstat
,您可以列出文件的创建时间。因为stat
没有选项可以去掉文件名的目录部分,所以我首先切换到包含该文件的目录。
for x in **/*.(#i)(mov|mkv|flv)(.N); do
(cd $x:h && TZ=UTC stat -t '%Y-%m-%d %H:%M:%S' -f %N,%SB -- $x:t)
done
GNU 查找、修改时间
使用 GNU find
,您可以使用-printf
基本的以所需的格式呈现输出。使用%f
对于不带目录部分的文件名和%T
随后是一个时间格式为修改时间。要匹配多个扩展名,-regex
和-regextype posix-extended
很方便。
TZ=UTC gfind -type f -regextype posix-extended -regex '.*\.(mov|mkv|flv)' \
-printf '%f,%TY-%Tm-%Td %TH:%TM:%TS\n'
/usr/bin/find
+ /usr/bin/stat
, 创建时间
在系统中find
,搜索部分与 GNU find 类似,只是使用-E
选项而不是-regextype posix-extended
主选项,但您需要使用 shell 代码来计算列表。该操作-execdir
可以方便地让您获取文件的基本名称。
TZ=UTC find -E . -regex '.*\.(mov|mkv|flv)' -type f \
-execdir sh -c 'for x do stat -t "%Y-%m-%d %H:%M:%S" -f %N,%SB -- "$x"; done' sh {} \;