use*_*323 5 linux directory find
有find . -type d -empty命令,但只能找到字面上的空目录。
我想要实现的目标有点复杂:我想找到空目录或仅具有其他目录或空目录的目录,并且应该递归地传递此规则。
例如,在这个目录结构中:
~1/11/111/
它将找到1/,1/11/和1/11/111/
但是,如果树中的任何一点都有一个文件,例如在这种情况下,如果其中有一个文件,则1/11/111/file1不应返回该文件之前的任何一个文件。1/11/111/1111/因此,如果旁边有一个空目录1/11/111/file1,则应返回 1111。
我想要这个的原因是因为我想删除我的空文件夹。
现在我可能可以通过find . -type d -empty -delete一遍又一遍地运行来做到这一点,但我想要一种在删除它们之前将其可视化的方法。
这可能吗?
要查看已删除的目录,只需插入-print:
find . -type d -empty -print -delete
Run Code Online (Sandbox Code Playgroud)
这将删除当前空目录下的任何子层次结构,同时显示已删除目录的路径名。
该-delete操作意味着-depth,即遍历将从目录结构的底部开始并向上进行(深度优先遍历)。这意味着任何可能考虑删除的目录都已经处理了其子目录(如果它们为空,这些子目录将被删除)。
例子:
$ mkdir -p 1/2/3/4/5/6
Run Code Online (Sandbox Code Playgroud)
$ tree
.
`-- 1
`-- 2
`-- 3
`-- 4
`-- 5
`-- 6
6 directories, 0 file
Run Code Online (Sandbox Code Playgroud)
$ find . -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
./1/2/3
./1/2
./1
Run Code Online (Sandbox Code Playgroud)
$ tree
.
0 directory, 0 file
Run Code Online (Sandbox Code Playgroud)
如果一个目录有一个文件:
$ mkdir -p 1/2/3/4/5/6
Run Code Online (Sandbox Code Playgroud)
$ touch 1/2/3/file
Run Code Online (Sandbox Code Playgroud)
$ tree
.
`-- 1
`-- 2
`-- 3
|-- 4
| `-- 5
| `-- 6
`-- file
6 directories, 1 file
Run Code Online (Sandbox Code Playgroud)
$ find . -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
Run Code Online (Sandbox Code Playgroud)
$ tree
.
`-- 1
`-- 2
`-- 3
`-- file
3 directories, 1 file
Run Code Online (Sandbox Code Playgroud)
列出仅包含子目录但不删除它们的目录(使用bash):
find . -type d -empty -print -delete
Run Code Online (Sandbox Code Playgroud)
这将循环遍历当前目录中的所有子目录(仅使用**shell glob),然后尝试查找其中任何一个都不是目录的内容。如果找到某些内容,则该目录不为空,否则输出空目录的路径名。
使用 GNU find,您可以添加-quit到上述命令的最末尾find(在 后面\;)以加快速度。