我正在尝试编写一个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
}
答案 0 :(得分:2)
不要将命令放在字符串中。不起作用。有关详细信息和讨论,请参阅http://mywiki.wooledge.org/BashFAQ/050。
您拥有数组中的命令。使用它。
遍历数组,找到要删除的参数并删除它们,然后添加要添加到数组中的参数并运行新命令。