我有一项任务,要求我创建一个可以采用这些参数的find版本:
> -name(处理名称的模式)
> -type(f和d)
> -print
> -exec(并且能够处理{},尽管如果存在exec,您可以假设它始终是最后一个参数,不需要用分号终止.
它还声明“谓词可以以任何顺序出现,并且隐式短路并在一起.不要处理-o(OR).”我也不允许在我的脚本中使用find.
因此,示例输入将如下所示:
myfind ~/dirtocheck/ -name '*.o' -type f -print -exec /bin/mv {} ~/.TRASH\;
关于如何完成所有这些,我有几个问题.
首先,我想知道如何使用递归来沿路径导航.这是我的函数的伪代码版本:
recurse_path () {
for i in "$@"; do
# call a function that executes rest of program
if [[ -d "${i}" ]]; then
cd "${i}"
recurse_path $(ls ".")
fi
done
}
其次,我不知道将传递多少个参数或者真正如何正确解析它们.在执行任何可以使这更容易的事情之前,我应该做些什么吗?
例如,我假设我们有一个’-exec’参数,我可以接受任何过去,并将其移动到一个数组中执行.但是我该怎么做呢?
最后,它是什么意思“谓词可以以任何顺序出现,并且隐含地短路并在一起.”我假设这意味着每件事都必须为下一个执行,但我不知道为什么它们会出现故障?
我会感谢任何帮助,甚至是如何构建它以使其工作的想法.
解决方法:
First of all, I was wondering how to use recursion to navigate down the path.
您的代码是一个良好的开端.为了表现得像find,我会删除对cd的调用,而是总是使用相对于起始目录的路径.这意味着递归越深,它们就越长.
另外recurse_path $(ls“.”)是一种编写recurse_path *的复杂方法.
Second, I don’t kNow how many arguments will be passed in or really how to parse them correctly.
作为提示,您可以编写一个循环来检查每次迭代$1,然后使用shift在它们被处理后删除参数,因此$1指向下一组参数.例如,如果$1是-name,则在$2中处理名称,然后调用shift 2.
For example, I’m assuming if we have a ‘-exec’ argument, I can take anything past that, and move it into an array for execution. But how would I do this?
如果你已经使用了基于移位的方法,那么-exec的参数自然可以简单地作为“$@”访问.
Finally, what does it mean by “Predicates can come in any order and are implicitly short circuit ANDed together.” I’m assuming this means that each thing must be true for the next one to execute, but I don’t kNow why they would be out of order?
你不能假设-name出现在-type之前.它们可能处于任何一种顺序,或者它们可能会丢失,甚至可能重复多次.例如:
myfind ~/dirtocheck/ -name '*.o' -type f
myfind ~/dirtocheck/ -type f -name '*.o'
myfind ~/dirtocheck/ -name 'MyClass*' -name '*.java'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。