bash -/etc/bashrc 中的函数未通过变量传递引号

标签 bash sed find

我正在尝试编写一个 bashrc 函数,以便在与“-exec rm”配对时为 find 命令添加安全检查。该脚本会切断以“-exec rm”开头的所有内容,并将其替换为“-print0”,然后将其传递给 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
       }

最佳答案

不要将命令放入字符串中。不起作用。请参阅http://mywiki.wooledge.org/BashFAQ/050了解更多详细信息和讨论。

您的命令位于数组中。使用它。

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

关于bash -/etc/bashrc 中的函数未通过变量传递引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275185/

相关文章:

bash - 如何从命令行将多张图片上传到 imgur 相册?

bash - 如何从 cron 运行的脚本运行 gpg?

bash - Makefile bash & xargs 变量不起作用

c++ - 在它后面找到 Word + X 个字母

bash - shell 脚本 : find a string by searching inside all the files in a folder?

perl - 一旦进程开始使用 shell 脚本就放弃 shell

unix - 在没有分号的末尾添加分号

sed - 让 sed 忽略不匹配的行

string - 第 N 个字符串匹配,然后删除后面的字符串并使用 sed 放置一个新字符串

c++ - OOP 迭代器和查找方法无法正常工作