在find -exec中,如何用{}替换当前文件?

在find -exec中,如何用{}替换当前文件?

我想找到所有不属于我的文件(即没有权限修改它)。我努力了

find . -exec if [[ ! -O {} ]]; then echo {}; fi ;

但是如果我将整个命令放在-exec引号中,如下所示:

find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;

这都不起作用,因为对当前文件的引用{}用引号引起来,因此不会扩展到该文件。

问题是,我不知道如何将{}当前文件嵌入到比简单的更复杂的文件-execfind . -exec grep smf {} \;(仅使用{}一次)。如何-exec在命令中使用 find 选项,多次引用当前文件? (即使用{}更多时间)。

答案1

您的代码无法运行,因为您要求find运行的实用程序if不存在(它是 shell 语法中的关键字)。

-O如果参数是当前用户拥有的文件,则测试为 true 。可以find使用以下命令自行完成相同的测试-user "$USER"(假设$USER扩展到当前用户):

find . -type f ! -user "$USER"

test -O如果您的外部test实用程序支持该非标准测试,您也可以使用(检查man test):

find . -type f ! -exec test -O {} \; -print

如果您仍然想要或需要使用shell-O中内置的测试bash,那么您必须生成一个bashshell 来执行测试:

find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print

bash -c将为每个找到的文件启动一个内联脚本,并对其第一个参数 ( ) 运行测试$1。参数在脚本的命令行上传递findbash前面的字符串{}将被放置在$0脚本内部,并将由该 shell 用于显示错误消息)。如果测试为真(该文件不属于您),-print则生效并打印文件的路径名。

您可以更有效地执行此操作

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

这更有效,因为它将批量的找到的路径名传递给bash -c脚本。

...但使用-user "$USER"将是更好的选择。

也可以看看:

相关内容