我正在尝试制作一个程序来删除名称中带有“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
.