【问题标题】:getting the output of "find" in a CSV在 CSV 中获取“find”的输出
【发布时间】:2017-03-18 19:51:40
【问题描述】:

我有一个项目,我试图将 linux 系统上的所有文件收集到 CSV 中,然后转储到数据库中。

我的脚本有

FIND_CMD $TARGET $OPTS -xdev $FS -printf "%h,%f,%y,%s,%TY-%Tm-%Td %TH:%TM:%.2TS\n"

但问题是我的文件名 %f 和目录名 %h 都带有逗号。

所以我想我可以把每个项目放在引号中,这不会是一个问题。

$FIND_CMD $TARGET $OPTS -xdev $FS -printf "\"%h\",\"%f\",\"%y\",\"%s\",\"%TY-%Tm-%Td %TH:%TM:%.2TS\"\n"

但后来我发现我的文件名中带有引号:(

所以我想弄清楚如何在整个事情周围加上引号。

例子:

"/home""dir","file,name","f","1024","2016-11-04 11:11:00"

所以我想知道是否有办法让我调用sed 作为-printf 的一部分,这样我就可以告诉查找命令将“s 替换为”s

我的另一个想法是将 find 命令中的分隔符替换为 | 之类的其他内容。但如果文件名或目录名具有 |,我可能会遇到同样的问题。在(这是可能的)

还有其他我可能没有想到的创造性解决方案吗?

【问题讨论】:

  • 编写一个脚本,在其标准输入上读取文件名,并根据需要格式化 CSV 行(它可以使用 stat 来获取所有属性)。然后将find ... -print 的输出通过管道传输到该位置。
  • Nul 不允许出现在文件名中(这就是为什么findprint0)所以这可能是一个很好的分隔符...en.m.wikipedia.org/wiki/Comparison_of_file_systems
  • @MarkSetchell 我认为可以做到。然后我不需要在每个值周围加上引号。仅使用 NUL 字节作为分隔符意味着我可以将 "" 放在 "s 所在的位置,并且我的 CSV 阅读器将能够处理它。谢谢!我会试一试!
  • @MarkSetchell 您的建议有效。 -printf "%h\0,%f\0,%y\0,%s\0,%TY-%Tm-%Td %TH:%TM:%.2TS\n" 做得很完美。如果您想发布答案,我很乐意将其标记为正确。

标签: linux sed find


【解决方案1】:

考虑在 CSV 中使用 NUL 作为分隔符,因为它不是 Linux 文件名/路径名中的有效字符 - Wikipedia refernce

这也是find 命令提供-print0 以及PerlGNU Parallel 等工具具有相应开关的原因: p>

find . -name '*.orig' -print0 | perl -n0e unlink

find . -print0 | parallel -0 ...

【讨论】:

  • 非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 2016-01-06
  • 2021-05-28
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多