首页 > 解决方案 > Linux:从 find 命令快速创建格式化输出文件 (csv)

问题描述

我有几个设备,我想将它们收集在一个列表(csv)中,以将它们放入 mysql 数据库中。我从一个设备开始,目标是从使用“find”创建的 infile 文件创建一个新的格式化输出文件。设备是 /mnt/sda4,我跳过了所有包含“.cache”的条目。我也已经剪了/mnt/sda4/

find /mnt/sda4 | grep -v '.cache' | cut -d'/' -f4- > infile

infile 是这样的:

Extern-500GB-btrfs/root/usr/lib64/libreoffice/share/config/soffice.cfg/dbaccess/ui/mysqlnativesettings.ui

Extern-500GB-btrfs/root/usr/lib64/libreoffice/share/config/soffice.cfg/dbaccess/ui/namematchingpage.ui

...

这部分非常快。

real    0m1,432s
user    0m1,079s
sys     0m0,873s

现在,我有两个解决方案,都(非常)慢,我想要一个新的输出列表,其中包含处理的每一行的以下内容;“06;” basename ";/" 整行已处理,如下所示:

06;mysqlnativesettings.ui;/Extern-500GB-btrfs/root/usr/lib64/libreoffice/share/config/soffice.cfg/dbaccess/ui/mysqlnativesettings.ui

06;namematchingpage.ui;/Extern-500GB-btrfs/root/usr/lib64/libreoffice/share/config/soffice.cfg/dbaccess/ui/namematchingpage.ui
...

time while read p; do bn=$(basename "$p"); echo "06;""$bn"";/""$p" >> outfile.csv; done < infile

这需要的时间是:

real    27m44,937s
user    10m4,539s
sys     18m6,491s

我再次尝试使用一个命令行同时结合查找和格式化:

time find /mnt/sda4/ | while read p; do g=$(echo $p | grep -c -v '\.cache'); case "$g" in 1) echo "06;$(basename "$p")"';/'$(cut -d'/' -f4- <<<"$p") >>outfile.csv;; *) : ;; esac; done

我忘记了这个时间,但也花了很长时间。

所以,我的问题是:是否有一种(更快)创建第二个表的方法,可能直接在使用 find 时创建?

先感谢您,

-Linuxfluesterer

标签: linuxformatfind

解决方案


我想问题在于循环和所有重定向;你考虑过使用awk吗?我认为以下内容应该可以满足您的所有需求-尽管我显然没有要测试的目录结构-并且速度相当快。

time find /mnt/sda4/ | awk 'BEGIN{FS=OFS="/"}!/.cache/ {$2=$3=""; new=sprintf("%s",$0);gsub(/^\/\/\//,"",new); printf "06;%s;/%s\n",$NF,new }' > outfile.csv

推荐阅读