我需要制作一个bash
带有两个参数的脚本,一个是要在文件名中搜索的字符串,下一个是要搜索的文件路径。接下来它需要一次遍历一个匹配的文件并将其打印出来,然后提示用户是否要删除它。
一个例子是:
./scriptName.sh foo /path/to/directory/
/path/to/directory/foo.txt
Delete this? (y/n)
user input
/path/to/directory/foop.txt
Delete this? (y/n)
user input
etc...
我最初尝试过
find $2 -type f -name "*$1*" -print
和
find $2 -type f -name "*$1*" -delete
其中是脚本的$1
第一个参数,是第二个参数。$2
这一直有效,直到我意识到它必须单独列出每个找到的文件并提示删除它们,这是一个问题,因为前两行代码只是立即删除所有匹配的文件。
答案1
您可以使用-ok
to 执行rm
找到的路径名,或者使用-exec
toexecute rm -i
。
这显示了每个的简短示例,并假设 是$searchpath
搜索路径并且$pattern
是最终的名称模式(例如"*$1*"
)。
使用-ok
:-ok
的操作find
与 类似-exec
,但它在执行给定实用程序之前首先要求用户确认。我们使用它来rm
单独执行每个找到的路径名。
find "$searchpath" -type f -name "$pattern" -ok rm {} \;
使用rm -i
:这将使rm
实用程序本身在删除文件之前要求确认。我们可以在批量路径名上使用它。
find "$searchpath" -type f -name "$pattern" -exec rm -i {} +
显然,您也可以实现自己的提示。这是一个bash
提示删除单个文件的脚本"$pathname"
:
read -p "Delete the file at $pathname? y/[n]: "
[[ "$REPLY" == [yY]* ]] && rm "$pathname"
find
为批量路径名调用此方法:
find "$searchpath" -type f -name "$pattern" -exec bash -c '
for pathname do
read -p "Delete the file at $pathname? y/[n]: "
[[ "$REPLY" == [yY]* ]] && rm "$pathname"
done' bash {} +
如果用户回复以大写或小写开头的字符串y
,则该文件将被删除。
有关的:
答案2
pattern=$1
dir=$2
for file in $(find ${dir} -type f -name "*${pattern}*")
do
/bin/rm -i ${file}
done
基本上,您正在循环查看命令返回的文件find
,并且rm -i
命令会询问您y/n
是否删除该文件的问题。我认为这就是您正在寻找的,但如果不是,请让人们知道您确切需要什么来获得进一步的帮助。