在bash中递归删除与父文件夹同名的文件夹?

在bash中递归删除与父文件夹同名的文件夹?

我的一台机器上的一些文件复制出了问题,我在父级中拥有同名的每个文件夹的副本,浪费了大量的空间,我想将它们全部删除。

例子:

 /mnt/test/files/foo
 \_ /mnt/test/files/foo/file1 (etc)
 |__ /mnt/test/files/foo/foo
 \_ /mnt/test/files/foo/foo/file1 (etc)
 |_ /mnt/files/foo/foo2
  \_ /mnt/files/foo/foo2/file1 (etc)
 |_ /mnt/files/foo/foo2/foo2
  \_ /mnt/files/foo/foo2/foo2/file1 (etc)

显然我想完全删除/mnt/files/foo/foo及其/mnt/files/foo/foo2/foo2内容(等等)并停止浪费空间。在 bash 中编写脚本的好方法是什么?

答案1

如果您find支持-regex谓词,您可以使用以下命令列出目录:

find . -type d -regex '.*/\([^/]*\)/\1' -prune -print

要删除它们,您可以更改-print为:

-exec rm -rf {} +

但请务必先检查列表,以免删除所需的任何文件。

答案2

使用非 GNU find(但仍然有一些支持的实现-mindepth,例如find在 BSD 系统上):

find top-dir -depth -mindepth 1 -type d -exec sh -c '
    for pathname do
        subdir=$pathname/${pathname##*/}
        if [ -d "$subdir" ]; then
            printf "Would remove directory %s\n" "$subdir"
            # rm -rfi "$subdir"
        fi
    done' sh {} +

这将对以 为根的目录层次结构进行深度优先遍历top-dir。对于批量找到的目录路径名,将调用一个简短的 shell 脚本。在短 shell 脚本中循环的每次迭代中,$pathname都会构造目录内与目录本身同名的子目录的路径名。如果该子目录存在,则会报告(为了安全起见,删除当前已被注释掉)。

-depth选项会导致深度优先遍历。当您使用 as 删除目录时,这通常是您想要的,find否则find可能会尝试输入已删除的目录。

-mindepth 1选项可确保顶级目录不会被删除,因为它会用作.起始搜索路径。

有关的:

相关内容