从选定文件的目录信息生成 CSV

从选定文件的目录信息生成 CSV

我使用的是 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 {} \;

相关内容