击.删除所有文件和目录,但删除某些文件

Bob*_*obo 11 directory bash ubuntu file

我正在编写一个脚本,需要从目录中删除所有内容,除了两个目录,mysql和temp.

我试过这个:

ls * | grep -v mysql | grep -v temp | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

但这也保留了所有名称中包含mysql的文件,我不需要.它也不会删除任何其他目录.

有任何想法吗?

Rub*_*ens 29

你可以尝试:

rm -rf !(mysql|init)
Run Code Online (Sandbox Code Playgroud)

这是POSIX定义的:

 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.
...
Run Code Online (Sandbox Code Playgroud)

注意:请先花点时间测试一下!要么创建一些测试文件夹,要么只是echo参数替换,正如@mnagel正确指出的那样:

echo !(mysql|init)
Run Code Online (Sandbox Code Playgroud)

添加有用信息:如果匹配未激活,您可以使用以下命令启用/禁用它:

shopt extglob                   # shows extglob status
shopt -s extglob                # enables extglob
shopt -u extglob                # disables extglob
Run Code Online (Sandbox Code Playgroud)

  • >确定这可以在命令行中使用,但不能在我的脚本中使用.语法错误:"("意外在脚本中,您需要显式启用扩展的globbing.将它放在行的上方:`shopt -s extglob`请参阅http://stackoverflow.com/questions/216995/how-can-i次使用的逆 - 或负通配符-当图案匹配-IN-A-UNIX的丽努 (2认同)

chr*_*ke- 5

这通常是一项工作find.尝试以下命令(-rf如果需要递归删除,请添加):

find . -maxdepth 1 \! \( -name mysql -o -name temp \) -exec rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

(也就是说,找到.不是[命名mysql或命名tmp]的子目录中的条目并调用rm它们.)