我有一个项目,我试图收集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"
但后来我发现我的文件名里有引号:(
所以我试着找出如何用引号把“with”改成“with”。
例子:
“/home”“dir”,“文件,名称”,“f”,“1024”,“2016-11-04 11:11:00”
所以我想知道是否有办法调用
sed
作为-printf
的一部分,这样我就可以告诉find命令将“s”替换为“s”我的另一个想法是将find命令中的分隔符替换为其他类似于|的内容,但是如果文件名或目录名中有| in(这是可能的),我可能会遇到同样的问题
有没有其他创造性的解决方案,我可能没有想到?
最佳答案
考虑在CSV中使用NUL作为分隔符,因为它在Linux文件名/路径名-Wikipedia refernce中不是有效字符。
这也是find
命令提供-print0
以及Perl和GNU Parallel等工具具有相应开关的原因,这些开关会导致:
find . -name '*.orig' -print0 | perl -n0e unlink
和
find . -print0 | parallel -0 ...