gpt4 book ai didi

regex - 更好的 bash 脚本来创建目录结构

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:22 25 4
gpt4 key购买 nike

我想用结构如下的纯文本创建文件夹:

Folder
| Subfolder
| | Deeper-subfolder
| Subfolder

我想过使用像 mkdir 这样的基本命令,然后发现那个帖子:Bash script that creates a directory structure , 但它仍然需要编写如下结构:

Folder
Folder/subfolder
Folder/subfolder/deeper-subfolder
Folder/subfolder

所以我需要更改 regex 中使用的:

sed '/^$/d;s/ /\//g' struct.txt | xargs mkdir -p

我可以使用什么 bash 命令来执行此操作?

最佳答案

使用纯 sed:

#!/bin/sed -f

x
G
: loop
s:\([^/]*\)/*\(.*\n\)\([^|]*\)|\s:\2\3\1/:
t loop

s/.*\n//
s:/*$::
h

为此,我们必须使用保留空间(辅助缓冲区)来存储先前的目录路径。然后我们可以从保留空间中删除目录并将它们替换到相应的 |s 中。更详细的解释如下:

此脚本针对每一行执行。我们做的第一件事是交换(“x”)保持空间和模式空间。最初,保留空间将为空,但在第一行之后保留空间将包含先前的目录路径。通过交换它们,我们加载以前的目录并将当前的新目录保存到保留空间中。

接下来,我们将新的目录名称附加到先前的目录路径(但两者将以换行符分隔)。用于此的命令是“G”。

现在我们必须为每个|循环我们发现的性格。要做到这一点是棘手的部分,所以请耐心等待。假设我们在当前模式空间中有以下内容

Folder/subdir
| | deeper-subdir
  1. 首先,\([^/]*\)匹配第一个斜杠之前的所有内容并捕获它(即,将其存储在一个名为 \1 的“变量”中,因为它是第一个捕获组)。
  2. 然后我们跳过斜杠:/*
  3. 捕获换行符(含)之前的所有内容并存储到捕获中 \2 : \(.*\n\)
  4. 抢先一步 |字符和存储到捕获中\3 : \([^|]*\)
  5. 跳过 |字符后跟一个空格字符:|\s

现在,捕获看起来像这样:

  1. 文件夹
  2. 子目录\n
  3. 3.

我们所要做的就是重新生成记录捕获的行并添加另一个斜线,这样它们就变成了:

subdir
Folder/| deeper-subdir

在那之后,我们有一个条件分支命令“t”,如果前面的“s”命令成功,它只会返回到“loop”标签。这意味着当字符串准备就绪时(不再有 |s),我们可以退出循环并继续代码。

按照示例,下一次迭代包含捕获:

  1. 子目录
  2. \n
  3. 文件夹/

循环后,第一个替换命令删除第一行,其中包含新目录未进入的路径,(即新目录比前一个目录“浅”)。

最后一个替换命令从行尾删除所有斜杠,最后一个命令是保留命令(“h”),它将当前生成的路径复制到保留空间,因此我们可以为下一行重复所有内容。

希望这有帮助 =)

关于regex - 更好的 bash 脚本来创建目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com