删除除两个文件外的所有文件

删除除两个文件外的所有文件

我想删除一个文件夹中的所有内容,但两个文件除外:

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错误。

相关内容