仅删除目录命令行

仅删除目录命令行

如何删除文件夹及其内容并保留当前目录中的文件?

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不显示匹配的记录

相关内容