【问题标题】:How to operate in a directory within a directory in bash如何在bash中目录中的目录中操作
【发布时间】:2018-10-11 00:46:18
【问题描述】:

我正在将目录中的内容放入其父目录中,同时在另一个目录中工作。如果每个目录都是一层,我正在尝试将内容从第 3 层复制到第 2 层,然后删除第 3 层。到目前为止,我有:

for d in "$layer1"/*; do

    temp=$(removespaces "$d")

    layer2=$(removeExtension "$temp")

    cp -r "$d" "$layer2"

    rm -r "$d"

    for dir in "$layer2"/*; do

        cp "$dir" "$layer2"

        rmdir "$dir" #This is the third layer(directory)
    done

done

第一个 for 循环的开始只是用我之前声明的一些函数重命名目录,没有问题。

如何将这个第三层的内容复制到第二层?

【问题讨论】:

  • 要重命名目录使用mv,而不是cp,后跟rm
  • 顺便说一句,请记住,当您执行for d in "$layer1"/* 时,如果是layer1='foo',那么您会得到类似d='foo/bar' 的信息。因此,使用for d2 in "$d1"/*,你会得到一个d2,比如foo/bar/baz。由于这些是完全合格的路径,因此您无需执行任何操作即可使用它们。
  • 不过,除此之外,要说出你在这里做什么有点棘手。您可以编辑它以提供minimal reproducible example 吗?创建旧名称的示例(并定义或删除诸如 removespacesremoveExtension 之类的依赖项,因此我们可以自己实际运行它并查看失败的原因),这样说起来会容易得多。

标签: bash for-loop directory


【解决方案1】:

最后一个cp需要复制单个文件,而不是整个目录。

cp "$dir"/* "$layer2"

但您可以更简单地使用mv 来完成这一切,并在路径名中使用两个通配符来获得第三级。

for d in "$layer1"/*; do
    temp=$(removespaces "$d")
    layer2=$(removeExtension "$temp")
    mkdir -p "$layer2"
    mv "$d"/*/* "$layer2"
    rmdir "$d"
done

【讨论】:

  • 成功了!非常感谢您的澄清,对不起,如果有点难以理解。我一定会在未来让我的问题更清楚。
  • 我总是建议在这种情况下使用mv -nmv -i,以防出现名称冲突(默认情况下它会静默且不可逆地覆盖其中一个文件)。跨度>
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多