Bash:Shell 脚本删除与所有传递的参数匹配的文件?

Bash:Shell 脚本删除与所有传递的参数匹配的文件?

这是一个作业问题,所以我不直接寻找答案或脚本。因此,在我的一个问题中,我被要求删除包含以下内容的文件:任何传递的命令行参数。这是脚本片段

#!/bin/sh

#some more stuff here

for args in "$@"; do
    if  [ $#  != 0 ]; then
        grep -l $args * | while read theFile; 
        do
            if [ -f "$theFile" ] ; then
                rm "$theFile"
                echo "$theFile is deleted with $args match"
            else
                echo "$theFile not deleted"
                exit 2
            fi
        done #end of while loop
    else 
        echo "No match found with $args"
        exit 1
    fi
    done
echo "DONE"
exit 0 

现在,我想知道我将如何编写脚本,以便它删除具有全部论据?我知道我需要检查每个文件是否都有通过 for 循环传递的参数,但我不确定如何编写它。任何意见将不胜感激。

如果需要该信息,我正在使用 cloud9 进行练习。

答案1

现在,您将循环遍历关键字 ( for arg in..),然后针对每个关键字检查哪些文件包含该关键字 ( grep -l $arg *)。

要检查包含所有关键字的文件,您可以将其反转,然后循环遍历所有文件 ( for f in *),然后循环遍历关键字 ( for arg in "$@"),检查文件是否包含它们 ( grep -qe "$arg" "$f"),仅在所有文件都匹配时才将其删除。

这有点暴力,因为你会执行grep n*次,对于n文件和关键词。另一种方法是运行grep -l第一个关键字,然后grep -l运行第二个关键字,给出grep最后一个 grep 返回的文件列表,等等。您可能希望在每一步中将文件列表保存在数组中。


附带说明一下,这没有任何意义:

for args in "$@"; do
    if  [ $#  != 0 ];

您正在检查每个参数运行一次的循环内的数字参数。$#当没有参数时恰好为零,但随后"$@"也不包含任何内容,并且循环将不会运行。

这里:

grep -l $args * | while read theFile; 

您可能应该引用$args,并且您可能还想看看Bash常见问题解答 001有关使用while read...的信息

简而言之,您可能想要

grep -l "$args" * | while IFS= read -r theFile; do

相关内容