从变量值在目录内创建目录,以重定向 sed 的输出

从变量值在目录内创建目录,以重定向 sed 的输出

我正在尝试获取一个文件,通过使用 for 循环(使用 sed)中的值来修改该文件,并将其重定向到在同一 for 循环期间创建的目录。

原始文件>创建目录>处理文件(进行更改)>将输出重定向到目录

我的问题是用我的变量值创建目录。

read NaMeoFFiLe
read startepsilonvalue
NaMeDiR="${startepsilonvalue}plus10steps"
mkdir "${NaMeDiR}"
for ((i=$stteps; i<=$lsteps; i+=1)); do
        k=$(bc <<<"""scale=1; $i /10")
        echo $k
        mkdir "${NaMeDiR}/${k}"
        ls "${NaMeDiR}"
        sed -e '0,/epsilon = ./{//c\epsilon = '"$startepsilonvalue" -e '}' \
                 "${NaMeoFFiLe}" > "${k}_${NaMeiFFiLe}"
        cat "${NaMeDiR}/${k}/${k}_${NaMeoFFiLe}" &
done

问题是我可以在 for 循环之外创建第一个目录,但在 for 循环内部它只创建第一个和最后一个目录,并且不会执行 sed 命令的更改。

我得到的错误是我查找的目录中不存在该文件,这很明显,因为尚未创建该目录。

我有什么遗漏的吗?

答案1

该代码片段中似乎有很多小事情可能会引起混乱。

首先,如所写的,$k有时可以以点开头(例如.1,,.2等),这在 Unix 中将目录定义为隐藏目录。我要检查的第一件事是这些目录是否被创建为隐藏:

ls -A

其次,您在父目录上创建${k}_${NaMeiFFiLe},而不是在您正在创建的新目录中。同样,由于$k在许多情况下以点开头,因此它可能隐藏在父目录中。鉴于您的代码流程,我认为您打算将文件保存在新的子目录中。如果为真,则看起来像这样(...为了简化,我将正则表达式替换为):

sed -e '...' "${NaMeoFFiLe}" > "${NaMeDiR}/${k}/${k}_${NaMeoFFiLe}"

作为旁注,mkdir有一个选项标志-p可以创建包括子目录的完整目录层次结构,这意味着您不需要外部循环mkdir

mkdir -p "${NaMeDiR}/${k}"

最后,作为一个更主观的旁注,我建议重新考虑如何大写变量名,因为对于代码审阅者来说,阅读起来非常困难......我认为其他一些评论者已经发现了一些可能存在的潜在拼写错误通过更好的命名约定来避免

相关内容