/ etc / bashrc中的函数不通过变量传递引号

时间:2014-12-03 15:13:26

标签: bash sed find

我正在尝试编写一个bashrc函数,以便在与" -exec rm"配对时为find命令添加安全检查。这个脚本切断了以" -exec rm"开头的所有内容。并将其替换为" -print0"然后,如果用户使用引用的experssion,则将其传递给sed以重新添加缺少的引号。

我遇到的问题是我通过sed添加的引号没有通过执行find命令传递给该行。

重写find命令并重新添加引号:

FIND_VAR=$(echo "$@" | sed "s/-exec rm.*/-print0/g" | sed 's/\*.* / "&" /g' | sed 's/ "/"/g')

运行带有修改的find命令:

FIND_LIST=$(/bin/find $FIND_VAR | sed 's|\./| \./|g')

我想要完成的是用户输入以下内容:

find ./ -type f -name "*.txt" -exec rm -rf {} \;

该命令通过bashrc重写为:

find ./ -type f -name "*.txt" -print0 | sed 's|\./| \./|g'

这将生成每个间隔开的文件列表,并传递给修改后的rm函数:

./file1.txt ./file2.txt ./file3.txt ...

下面列出了完整功能以供参考:

       function find () {
          if echo "$@" | grep -q '-exec rm' ; then
            echo "Found rm command as part of find"
            FIND_VAR=$(echo "$@" | sed "s/-exec rm.*/-print0/g" | sed 's/\*.* / "&" /g' | sed 's/ "/"/g')
            echo "/bin/find $FIND_VAR"
            FIND_LIST=$(/bin/find $FIND_VAR | sed 's|\./| \./|g')
            echo "$FIND_LIST"
            echo "rm$FIND_LIST"
          else
            /bin/find "$@"
          fi
       }

1 个答案:

答案 0 :(得分:2)

不要将命令放在字符串中。不起作用。有关详细信息和讨论,请参阅http://mywiki.wooledge.org/BashFAQ/050

您拥有数组中的命令。使用它。

遍历数组,找到要删除的参数并删除它们,然后添加要添加到数组中的参数并运行新命令。