【问题标题】:Batch removing a sub folder in several parent folders批量删除多个父文件夹中的子文件夹
【发布时间】:2017-12-12 12:05:57
【问题描述】:

在 linux 中,我有一组文件夹,它们都包含相同的子文件夹结构。例如

文件夹A/x/y/z/file1.txt

文件夹A/x/y/z/file2.txt

文件夹B/x/y/z/file1.txt

文件夹C/x/y/z/file1.txt

我想运行批处理以删除其中一个子文件夹,但保留下面的所有文件和文件夹不变。例如。如果我要删除文件夹“y”:

文件夹A/x/z/file1.txt

文件夹A/x/z/file2.txt

文件夹B/x/z/file1.txt

文件夹C/x/z/file1.txt

我尝试过将 find 和 mv 组合在一起,但不能完全正确

【问题讨论】:

    标签: linux bash batch-processing


    【解决方案1】:
    find . -name y -type d -exec sh -c '
      for d; do echo mv "$d"/* "$d"/..; echo rmdir "$d"; done' _ {} +
    

    如果结果符合您的预期,请删除 echos。

    【讨论】:

      【解决方案2】:

      考虑到您想要删除其中一个子文件夹,但保留下面的所有文件和文件夹不变,您可以执行以下操作。这不是一个精确的解决方案,一种可能对您有用的技巧。我在我的电脑上做了很多次。

      您可以递归地将子文件夹的内容复制到其父文件夹,然后遍历父目录,最后递归删除子文件夹。

      1. 遍历到子文件夹

        $ cd path/to/SubFolder

      2. 以递归方式将所有内容复制到父文件夹

        $ cp -R * ..

      3. 遍历到父文件夹

        $ cd ..

      4. 递归删除子文件夹

        $ rm -rf 子文件夹/

      假设你有一个文件夹 y,那么,

      $ cd 路径/到/文件夹/y $ cp -R * .. $ 光盘 .. $ rm -rf y/

      对于运行批处理,您可以使用 find 命令找出子文件夹的路径。

      请注意,如果文件夹中有很多文件夹,此技巧会消耗大量时间和资源。但这行得通!

      【讨论】:

      • 移动会比复制快很多(因为无论如何你都要删除文件)。你是对的——这基本上就是我想要做的。我遇到的问题实际上是在大量目录上编写正确的“find -exec mv”类型命令。
      • 哦,我刚刚在回答完这个问题后才发现,然后想“这也行”。无论如何,你显然是绝对正确的。