递归地将文件名附加到 [Markdown] 文件的开头

递归地将文件名附加到 [Markdown] 文件的开头

我有一个文件夹,里面有很多文件夹,每个文件夹都有很多 Markdown 文件。我想做的是递归地(如果可能)将文件名作为每个文件中的标题。

所以,给定foo.md

The cat sat on the carpet, which is really just endless mat to a cat.

我想要:

# Foo.md

The cat sat on the carpet, which is really just endless mat to a cat.

我不关心文件扩展名。我很烦恼它是一个有效的 Markdown 标题 1,后面有一行。


我的文件结构看起来像

md/
  foo/
    heaps.md
    and.md
  bar/
    heaps.md
    of.md
  baz/
    files.md
    omg.md

等等等等。理想情况下,我想要一些可以复制到 .sh 或类似文件中的东西,但单行也很好!

干杯。

答案1

尝试 bash 的 globstar 和 ed 加上一些 PE,我建议您首先尝试一些示例数据/目录。

shopt -s globstar

for f in md/**/*.md; do 
  header=${f##*/} header=${header^}
  printf '%s\n' 0a "# $header" "" . w | ed -s "$f"
done

或者是单衬,但记得要设置globstar

for f in md/**/*.md; do header=${f##*/} header=${header^}; printf '%s\n' 0a "# $header" "" . w | ed -s "$f" ; done

要在 globstar 仍然打开时检查文件的内容,您可以尝试。

tail -n+1  md/**/*.md

0是缓冲区中的地址或行号,是表示或的a操作appendadd

额外的""是在文件中的下一行之前创建一个空行。

虽然1i(这意味着在第一行插入)代替0a 也可以工作,但对于空文件它将失败。

.告诉 ed 文件编辑完成并w意味着将其写入文件

管道|ed-s意味着沉默并且不输出任何内容到stdout

剩下的只是 bash shell 中的一些变量分配和 PE。

相关内容