【发布时间】:2026-02-02 19:00:01
【问题描述】:
我正在编写一个脚本,它需要从一个目录中删除所有内容,除了两个目录 mysql 和 temp。
我试过了:
ls * | grep -v mysql | grep -v temp | xargs rm -rf
但这也保留了所有名称中包含 mysql 的文件,我不需要这些文件。它也不会删除任何其他目录。
有什么想法吗?
【问题讨论】:
标签: bash file ubuntu directory
我正在编写一个脚本,它需要从一个目录中删除所有内容,除了两个目录 mysql 和 temp。
我试过了:
ls * | grep -v mysql | grep -v temp | xargs rm -rf
但这也保留了所有名称中包含 mysql 的文件,我不需要这些文件。它也不会删除任何其他目录。
有什么想法吗?
【问题讨论】:
标签: bash file ubuntu directory
你可以试试:
rm -rf !(mysql|init)
Glob patterns can also contain pattern lists. A pattern list is a sequence
of one or more patterns separated by either | or &. ... The following list
describes valid sub-patterns.
...
!(pattern-list):
Matches any string that does not match the specified pattern-list.
...
注意:请先花点时间测试一下!要么创建一些测试文件夹,要么只是echo 参数替换,正如@mnagel 适当指出的那样:
echo !(mysql|init)
Adding useful information: 如果匹配不是active,你可以通过以下方式启用/禁用它:
shopt extglob # shows extglob status
shopt -s extglob # enables extglob
shopt -u extglob # disables extglob
【讨论】:
echo,如echo !(mysql|init)
shopt -s extglob 请参阅*.com/questions/216995/…
这通常是find 的工作。尝试以下命令(如果需要递归删除,请添加 -rf):
find . -maxdepth 1 \! \( -name mysql -o -name temp \) -exec rm '{}' \;
(也就是说,在. 中查找条目,但在不是[命名为mysql 或命名为tmp] 的子目录中查找条目,并在它们上调用rm。)
【讨论】:
maxdepth 选项。删除-exec rm '{}' \; 以获取匹配文件的列表,其中不包括./ 以下的任何内容。
.,所以如果你正在执行rm -Rf,可能会删除比你想要的更多...
你可以使用find,忽略mysql和temp,然后rm -rf。
find . ! -iname mysql ! -iname temp -exec rm -rf {} \;
【讨论】:
find . -maxdepth 1 ! -iname mysql ! -iname temp -exec rm -rf {} \;,或者更好的是find . -maxdepth 1 ! -iname mysql ! -iname temp -delete