我无法在 bash 脚本中调用通配符 *

我无法在 bash 脚本中调用通配符 *

我正在尝试制作一个程序来删除名称中带有“v”的文件

在我的脚本中,我要求查看一个目录。代码基本上如下所示

read -p "directory: " DIRECT

rm *v* $DIRECT

它认为*v*是一个文件或目录的名称,并告诉我不存在类似的东西,它只是跳转到DIRECT并说它无法删除。

答案1

为什么不使用“find”而不是“rm”:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

你的脚本看起来像这样:

read -p "directory: " directory

find "$directory" -name "*v*" -type f -delete

find 检查起始目录是否存在,并默认搜索该目录的所有子目录。如果您不想递归搜索,则必须添加将-maxdepth 0搜索限制为仅起始目录的选项。在上面的示例中,我使用-name标志来搜索文件名,但您也可以使用正则表达式(-regex选项)。您还可以按文件类型(标志)限制搜索-type。例如,-type f将搜索限制为仅常规文件。使用 -delete 标志表明您想要删除找到的文件。如果您需要更多选择:sh# man find是您的朋友;)

答案2

事情不是这样的rm。尝试这样:

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
rm "${SEARCH_DIR}/"*v*

rm在最后一个参数中查找文件,我建议在使用 rm 时始终使用完整路径或相对路径,尤其是使用通配符,否则您会做一些可怕的事情。

[root@JBCLAMP001 ~]# rm --help
Usage: rm [OPTION]... FILE...

你也可以这样做:

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
for file in "$SEARCH_DIR/"*; do
    if [ -f "$file" ]; then
        if [[ $(basename $file | grep "v") ]]; then
            rm -f "$file"
        fi
    fi
done

答案3

删除部分可以更改为:

read -p "directory: " DIRECT

( shopt -s extglob ; rm -f "$DIRECT/"+([!v]) )

子外壳(……)将避免改变正在运行的 shell 的条件。

另一种方法是使用 find:

find . -maxdepth 1 -regex '[^v]+' -type f -exec rm {} +

答案4

为了防止rm抱怨没有文件/目录匹配,*v*您应该使用该-f选项。如果要删除这些潜在的 v 文件,$DIRECT您应该执行以下操作:

read -p "directory: " DIRECT

rm -f "$DIRECT"/*v*

如果找不到任何要删除的内容(即缺少 v 文件,甚至缺少目录$DIRECT.

相关内容