我正在尝试编写一个 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/