我的一台机器上的一些文件复制出了问题,我在父级中拥有同名的每个文件夹的副本,浪费了大量的空间,我想将它们全部删除。
例子:
/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
选项可确保顶级目录不会被删除,因为它会用作.
起始搜索路径。
有关的: