我想删除一个文件夹中的所有内容,但两个文件除外:
exec.js
.git
我找到了这个:
rm !(exec.js|.git)
这在 CL 中有效,但是当我尝试存储在 sh 文件中并使用 调用时bash file.sh
,会发生这种情况:
test.sh: line 1: syntax error near unexpected token `('
test.sh: line 1: `rm !(exec.js|.git)'
有什么想法吗?
答案1
你需要
shopt -s extglob
在脚本里面。
您的 bash 配置可能会自动为交互式 shell 打开此功能(可能是因为您加载了 bash-completion 包以实现上下文相关的完成);您需要在脚本内手动打开它。
另请确保您的脚本以#!/bin/bash
( 或类似 的变体开头#!/usr/bin/env bash
,否则它可能会由不支持此语法的不同 shell 执行。
例如,此脚本将创建一些文件,然后删除除要保留的两个文件之外的所有文件:
$ cat x
#!/bin/bash
shopt -s extglob
touch f1 f2 f3 exec.js .git foo bar
echo Before: $(ls -A)
rm !(exec.js|.git)
echo After: $(ls -A)
执行中:
$ bash x
Before: .git bar exec.js f1 f2 f3 foo x
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory
After: .git exec.js
请注意,使用.
和会出现错误..
;您也会在命令行上看到这些:
$ touch f1 f2 f3 exec.js .git foo bar
$ rm !(exec.js|.git)
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory
答案2
作为建议,您可以添加
GLOBIGNORE=.:..
之后以shopt -s extglob
避免rm: cannot remove '.': Is a directory
错误。