如何删除文件夹及其内容并保留当前目录中的文件?
前
parent
├── folder1
├── folder2
│ ├── file1
│ ├── file2
├── folder3
├── file3
├── file4
└── file5
后:
parent
├── file3
├── file4
└── file5
答案1
类似这样的方法就可以了
cd parent
find . ! -path . -maxdepth 1 -type d -exec rm -rf {} \;
这将在当前工作目录中查找目录,并仅向下递归 1 级,然后删除目录。执行此操作之前,最好先使用 ls 而不是 rm 进行测试运行,以便检查将删除哪些内容
cd parent
find . ! -path . -maxdepth 1 -type d -exec ls {} \;
例子
jake@jake-HP /tmp/test $ tree
.
├── 1
├── 2
├── bar
│ ├── 1
│ ├── 2
│ └── 3
├── blah
│ ├── 1
│ ├── 2
│ └── 3
└── foo
├── 5
└── 9
3 directories, 10 files
jake@jake-HP /tmp/test $ find . ! -path . -maxdepth 1 -type d -exec ls {} \;
1 2 bar blah foo
1 2 3
5 9
1 2 3
jake@jake-HP /tmp/test $ find . ! -path . -maxdepth 1 -type d -exec rm -rf {} \;
jake@jake-HP /tmp/test $ tree
.
├── 1
└── 2
0 directories, 2 files
答案2
使用 find 是个不错的选择,因为您可以准确指定要执行的操作。但是 Jake 的答案中的 xargs 在处理包含空格的目录名称时存在问题。您需要在 find 中添加 -print0,在 xargs 中添加 -0。
我会写
find parent -type d -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
这更简单:
rm -rf parent/*/
但是它不会删除隐藏目录(以句点开头),您需要添加它们:
rm -rf parent/*/ parent/.[^.]*/
不过,如果您有指向其他地方的符号链接,请小心。
如果你不相信 */ 只匹配目录,那么一个不太干净的解决方案会产生很多错误(并且不考虑隐藏目录,因为这会变得复杂)是
rm -rf parent/*/*
rmdir parent/*
答案3
你可以给ls
一个机会
我在 Mac 上测试过
ls -p | grep / | xargs -I _ mv _ ~/.trash
很容易做到rm
,因为结果已经被过滤
移动到
~/.trash
,这给你第二次机会-v
不显示匹配的记录