当前位置: 首页 > news >正文

Shell 编程技巧:批量转换Markdown文件

由于一些原因,需要将以前编写的所有markdown文件转成docx文件,以便做一个备份,特别是原文档中引用的图片需要嵌入docx文件,作本地化保存。先上脚本吧:

sudo yum -y install pandoc
# set new line char as IFS 
IFS=$'\n'# convert...
for srcFile in $(find . -type f -name '*.md'); dosinkFile="$(dirname $srcFile)/$(basename $srcFile .md).docx"echo "source file: $srcFile"echo "sink file: $sinkFile"pandoc -o $sinkFile $srcFile
done# restore default IFS chars 
IFS=$' \t\n'

这个脚本里还是有不少“知识点”的,这里特别强调以下几条:

  1. 由于文件名可能含有空格,在迭代时会被截断!使用双引号包裹srcFile变量:"$srcFile" 并不能解决问题,因为迭代的元素已经不是一行一行的文件路径了,使用echo 'source file: '"$srcFile"打印一下问题就能暴露出来。真正有效的做法是必须设定IFS!将其设为换行符\n,只有这样才能正确地将find输出的一整行可能包含空格的文件路径解析为一个独立的元素!

  2. 为IFS设置换行符\n时必须是:IFS=$'\n',不是IFS='\n'$不可省略

  3. 上述命令使用 find . -type f -name '*.md' -exec sh -c '...' sh {} + 这种形式也可以实现,好处是不用特别配置IFS了,在-exec{}能完好表示每一行输出,不存在空格截断问题。不过,因为在这个案例中,我们还是要在文件路径的基础上使用dirnamebasename来拼接我们需要的目标文件路径,同时也无法避免不使用for循环,所以这时使用-exec的优势并不明显,反而还很难阅读,所以不如使用上面的传统模式来得很简洁一些。以下是find命令的-exec-execdir的一些测试命令,对于理解它们的用法有一定的帮助:

测试

find . -type f -name '*.md' -exec ls {} \;
find . -type f -name '*.md' -execdir ls {} \;
find . -type f -name '*.md' -exec dirname {} \;
find . -type f -name '*.md' -execdir dirname {} \;
# output: 
find . -type f -name '*.md' -exec sh -c 'for name dols "$(dirname "$name")/$(basename "$name")"done' sh {} +find . -type f -name '*.md' -exec sh -c 'for name dols "$(dirname "$name")/$(basename "$name" ".md")"done' sh {} +find . -type f -name '*.md' -exec sh -c 'for name doecho "$(dirname "$name")/$(basename "$name" ".md").docx"done' sh {} +

补充说明:

	-execdir command {} +Like -exec, but the speci`fied command is run from the subdirectory containing the matched file ...

参考:

https://unix.stackexchange.com/questions/389705/understanding-the-exec-option-of-find

相关文章:

Shell 编程技巧:批量转换Markdown文件

由于一些原因,需要将以前编写的所有markdown文件转成docx文件,以便做一个备份,特别是原文档中引用的图片需要嵌入docx文件,作本地化保存。先上脚本吧: sudo yum -y install pandoc # set new line char as IFS IFS$\…...

EasyAVFilter的初衷:把ffmpeg.c当做SDK来用,而不是当做EXE来用

之前我们做一个视频点播的功能,大概的流程就是将上传上来的各种格式的视频,用FFmpeg统一进行一次转码,如果probe到视频的编码格式是H.264就调用-vcodec copy,如果probe到视频的编码格式不是H.264就调用-vcodec libx264&#xff0c…...

内存管理之:内存空间分布和栈攻击(黑客常用攻击手段)

目录 C语言内存管理及栈攻击 内存管理 Linux虚拟内存空间分布(重要) 栈溢出(栈攻击) 堆栈的特点 栈攻击 栈攻击的实现 原理 编译器选项 实现案例 linux修改栈空间大小方式 内存泄漏 如何避免野指针? 如何…...

一米facebook功能点

用户信息批量修改 可批量修改已登录用户的头像、密码、个人说明等信息。 小号批量刷赞、评论 可以批量用facebook小号给帖子、主页等刷赞或评论。 直播帖刷人气/评论/分享 可以直接刷直播帖子的人气、评论,并可一键分享到小组或个人时间线、公共主页等。 小组成员…...

uni-app:监听数据变化(watch监听、@input事件)

方法一&#xff1a;文本框监听,使用input事件 <template><view><input type"text" v-model"wip_entity_name" input"handleInputChange" /></view> </template><script> export default {data() {return {…...

提升C语言的方法?

我个人的习惯&#xff0c;学一门新的编程语言一定是需要目的的。 也就是学这个语言是干什么&#xff1f; 单纯的上学学习C语言一般都是工科的专业作为专业课而开设的学科&#xff0c;这种很多都是使用谭浩强的教材&#xff0c;很多同学也基本没听&#xff0c;所以学习效果也是…...

WPF_布局基础

布局容器 Grid 定义由列和行组成的灵活的网格区域。 行 <Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions> 列 <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDe…...

【SA8295P 源码分析】87 - SA8295P HQNX + Android 编译环境搭建指导

【SA8295P 源码分析】87 - SA8295P HQNX + Android 编译环境搭建指导 一、Android 编译环境搭建:Android + sa8295p-hqx-4-2-4-0_hlos_dev_la.tar.gz1.1 更新 Ubuntu 18.04 源路径1.2 安装基础编译环境1.3 设置JDK8 的环境变量1.4 配置sh为bash(默认为dash)1.5 Android 编译…...

java基础-----第九篇

系列文章目录 文章目录 系列文章目录前言一、GC如何判断对象可以被回收前言 一、GC如何判断对象可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收, 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的…...

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念&#xff1a;规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件&#xff1b;线性规划即以线性函数为目标函数&a…...

OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse() 4.绘制矩形rectangle() 5.绘制多边形 fillPoly() 6.绘制文字putText() 7.例子 1.绘制直线line() CV_EXPORTS_W void line(InputOutputArray img,Point pt1, Point pt2,const Scalar& color,int t…...

[华为云云服务器评测] Unbutnu添加SSH Key、编译启动Springboot项目

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 第二章 [linux实战] Unbutnu添加SSH Key、启动Springboot项目 文章目录 系列文章目录前言一、任务拆解二、配置git,添加SSH Key2.1、登录远程主机2.2、配置git用户名和邮箱2.3、生成SSH key2.4、查…...

【MySQL学习笔记】(七)内置函数

内置函数 日期函数示例案例-1案例-2 字符串函数示例 数学函数其他函数 日期函数 示例 获得当前年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-09-03 | ---------------- 1 row in set (0.00 sec)获得当前时分秒…...

《Python魔法大冒险》004第一个魔法程序

在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前。桌子上摆放着那台神秘的笔记本电脑。 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器。是时候开始编写你的第一个Python魔法程序了! 小鱼:(兴奋地两眼放光)我准备好了! 魔法师: 不用担心,…...

架构,平台,框架的区别和联系

1、解释说明 - 架构&#xff1a;在软件开发中&#xff0c;架构是指软件的整体设计和组织方式。它包括了软件的结构、组件和交互方式等方面的设计。架构定义了系统的高级结构和组织方式&#xff0c;以及各个组件之间的关系和交互方式。一个良好的架构可以提高软件的可维护性、可…...

Mac 安装php多版本,brew安装php8.0

因为需要我要在mac上装两个php版本&#xff0c;先前我已经装过php7.4,下面我们逐步安装php8.0 开始安装8.0&#xff1a; 直接运行安装 brew install php8.0 遇到问题怀疑是仓库太老了&#xff0c;更新一下homebrew ,重新安装 brew update 安装成功了,不过看了下版本好像不能正…...

【100天精通Python】Day53:Python 数据分析_NumPy数据操作和分析进阶

目录 1. 广播 2 文件输入和输出 3 随机数生成 4 线性代数操作 5 进阶操作 6 数据分析示例 1. 广播 广播是NumPy中的一种机制&#xff0c;用于在不同形状的数组之间执行元素级操作&#xff0c;使它们具有兼容的形状。广播允许你在不显式复制数据的情况下&#xff0c;对不同…...

druid连接不上doris有哪些可能原因

如果你在使用Druid连接池连接Doris时遇到问题&#xff0c;无法连接上数据库&#xff0c;可能有以下几个原因和解决方案&#xff1a; 网络配置问题&#xff1a;确保你的应用程序能够与Doris数据库所在的服务器进行通信。检查防火墙设置、网络配置以及Doris数据库的监听端口是否…...

双边滤波 Bilateral Filtering

本文是对图像去噪领域经典的双边滤波法的一个简要介绍与总结&#xff0c;论文链接如下&#xff1a; https://users.soe.ucsc.edu/~manduchi/Papers/ICCV98.pdf 1.前言引入 对一副原始灰度图像&#xff0c;我们将它建模为一张二维矩阵u&#xff0c;每个元素称为一个像素pixel&am…...

PXE批量装机

目录 前言 一、交互式 &#xff08;一&#xff09;、搭建环境 &#xff08;二&#xff09;、配置dhcp服务 &#xff08;三&#xff09;、FTP服务 &#xff08;四&#xff09;、配置TFTP服务 &#xff08;五&#xff09;、准备pxelinx.0文件、引导文件、内核文件 &#…...

NSSM神器:一键将任意应用注册为Windows服务并实现日志自动分割

NSSM实战指南&#xff1a;将Windows应用转化为可靠系统服务的完整方案 在Windows服务器运维和开发过程中&#xff0c;我们经常需要确保关键应用程序能够持续稳定运行&#xff0c;即使系统重启或用户注销也不受影响。传统方式下&#xff0c;开发者通常需要编写复杂的服务包装代码…...

别再乱用Adam了!PyTorch中AdamW优化器的正确打开方式(附代码示例)

别再乱用Adam了&#xff01;PyTorch中AdamW优化器的正确打开方式&#xff08;附代码示例&#xff09; 当你盯着训练曲线发呆&#xff0c;发现验证集表现始终不如预期时&#xff0c;或许该检查一下优化器的选择了。很多开发者习惯性地在PyTorch脚本里写下optim.Adam(model.para…...

遥感影像裁剪避坑指南:如何用ENVI5.3的Subset功能精准提取县区数据(含背景值设置技巧)

遥感影像裁剪避坑指南&#xff1a;ENVI5.3 Subset功能深度解析与实战技巧 当你在处理县域尺度的遥感影像分析时&#xff0c;是否遇到过裁剪后图像边缘出现黑边、数据丢失或坐标错位的问题&#xff1f;这些看似简单的操作细节&#xff0c;往往成为影响后续分析精度的关键因素。本…...

FGSM对抗攻击实战:从理论到PyTorch代码的完整攻防演练

1. 对抗攻击入门&#xff1a;为什么你的AI模型会被"骗"&#xff1f; 想象一下&#xff0c;你训练了一个准确率高达99%的手写数字识别模型&#xff0c;但在实际应用中却发现它经常把"3"识别成"8"&#xff0c;把"6"识别成"0"。…...

MOOTDX零代码金融数据解决方案:3个核心价值点解锁股票数据可视化分析

MOOTDX零代码金融数据解决方案&#xff1a;3个核心价值点解锁股票数据可视化分析 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 一、价值定位&#xff1a;为什么MOOTDX是金融数据获取的最优解 打…...

Flutter开发踩坑记:CocoaPods安装失败全流程解决方案(含Ruby版本升级)

Flutter开发实战&#xff1a;CocoaPods安装失败的系统级解决方案 当你满怀期待地运行flutter doctor准备大展身手时&#xff0c;屏幕上突然跳出"CocoaPods not installed"的红色警告&#xff0c;这种挫败感每个Flutter开发者都深有体会。不同于简单的"安装-运行…...

AI Agent操作系统架构师:Harness Engineer解析

Harness Engineer&#xff1a;AI Agent时代的「系统架构师」&#xff0c;打造可执行可信赖的智能体操作系统引言 当大语言模型从「对话助手」进化为「能干活的AI Agent」&#xff0c;我们发现一个核心矛盾&#xff1a;模型的概率性灵活能力与业务的确定性执行要求始终无法调和。…...

Nunchaku-FLUX.1-dev副业变现路径:AI绘画接单全流程(接单→提示词→交付)

Nunchaku-FLUX.1-dev副业变现路径&#xff1a;AI绘画接单全流程&#xff08;接单→提示词→交付&#xff09; 1. 从兴趣到收入&#xff1a;为什么选择Nunchaku-FLUX.1-dev做副业 如果你对AI绘画感兴趣&#xff0c;并且拥有一张消费级的显卡&#xff0c;比如RTX 3090或4090&am…...

TrafficMonitor插件系统:5个技巧打造你的个性化Windows监控中心

TrafficMonitor插件系统&#xff1a;5个技巧打造你的个性化Windows监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 想要让Windows任务栏上的TrafficMonitor变得更加强大…...

Spring_couplet_generation 助力科研:使用MATLAB进行生成结果的数据分析与可视化

Spring_couplet_generation 助力科研&#xff1a;使用MATLAB进行生成结果的数据分析与可视化 1. 引言 想象一下&#xff0c;你是一位研究语言文化或社会科学的学者&#xff0c;最近利用AI模型生成了成千上万副春联。面对这海量的文本数据&#xff0c;你可能会感到既兴奋又头疼…...