Exec允许我们要么与一次传递所有参数,要么与{} +一对一传递它们{} \;
现在假设我想重命名所有jpeg,这样做没有问题:
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec mv '{}' '{}'.new \;
但是,如果我需要重定向输出,'{}'重定向后将无法访问。
find . \( -name '*.jpg' -o -name '*.jpeg' \) -exec cjpeg -quality 80 '{}' > optimized_'{}' \;
这行不通。我必须使用for循环,在使用find之前将其输出存储到变量中。让我们承认,它很麻烦。
for f in `find . \( -name '*.jpg' -o -name '*.jpeg' \)`; do cjpeg -quality 80 $f > optimized_$f; done;
那有更好的方法吗?
{}在较长的字符串中出现命令行,因为此类字符串通常不会扩展。
find一次,然后应用于find命令本身。该{}在这方面没有任何特殊含义。重定向不是的参数find,它当然也不是该-exec子句的一部分。
>第三代码示例中是否没有缺少内容?