Bash 脚本查找名称中包含给定字符串的文件,然后以交互方式删除它们

Bash 脚本查找名称中包含给定字符串的文件,然后以交互方式删除它们

我需要制作一个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

您可以使用-okto 执行rm找到的路径名,或者使用-exectoexecute 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是否删除该文件的问题。我认为这就是您正在寻找的,但如果不是,请让人们知道您确切需要什么来获得进一步的帮助。

相关内容