linux - 在 CSV 中获取 "find"的输出

标签 linux sed find

我有一个项目,我试图将 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 的一部分进行调用,这样我就可以告诉 find 命令将“s”替换为“”

我的另一个想法是将我的 find 命令中的定界符替换为其他类似的东西 |但如果文件名或目录名有一个 |,我可能会遇到同样的问题在(这是可能的)

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

最佳答案

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

这也是 find 的原因命令提供 -print0并且 PerlGNU Parallel 等工具具有相应的开关,从而产生:

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

find . -print0 | parallel -0 ...

关于linux - 在 CSV 中获取 "find"的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431822/

相关文章:

python - Linux Only 'ascii' 编解码器无法对位置 3 : ordinal not in range(128) 中的字符 u'\u0161' 进行编码

linux - 如果不存在,如何将文本行添加到文件

perl - 如果 csv 文件可以在引用的字符串中用逗号引用,那么将 csv 文件转换为 tsv 文件的平台独立方法是什么?

regex - 正则表达式类型之间的差异

find - Notepad++ 在文件中查找过滤器 EXCLUDE

linux - 查找 -exec cmd {} + vs | xargs

php - 访问根目录之外的文件

linux - 基于 Linux 的系统上类似于 Dropbox 的自动文件版本控制

python - grep 不允许我写 `[:alpha:]` 当我的意思是 `[:alph]` 但其他工具可以

linux - 如果在 Linux 中任何其他列中有零,如何将除第一列以外的整行设为零?