linux - 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
解决方案
我想问题在于循环和所有重定向;你考虑过使用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
推荐阅读
- r - 如何在 R data.table 中按组进行子集化时获取不同行数的切片
- javascript - 为什么 Firebase 的实时数据库的 child_removed 事件处理程序不执行?
- javascript - 我有一个循环,其条件取决于循环本身调用的函数的布尔值
- laravel - 缺少路线 bus.edit 所需的参数
- node.js - 将nodejs程序的输出重定向到文件时编码错误(windows 10 powershell可能的问题)
- scala - 如果组的任何行具有 0 值,我将如何使用 ANY 条件进行过滤?
- java - "GeorgeNotFound" 的 MinecraftShocker 插件如果你有这个错误:jSSC-2.8_x86_64.dll+0xb5db,如何修复
- next.js - Next.js 和 Styled Components 在刷新时服务器和客户端之间不同步
- javascript - 在本地插件(Strapi)中使用 .env
- javascript - javascript: for void 在 for 循环的上下文中是什么意思?