我想查找不属于我的所有文件(即无权对其进行修改)。我试过了
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
但是,如果我将整个命令-exec
放在引号后,例如:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
都不行,因为对当前文件的引用{}
用引号引起来,因此不会扩展到该文件。
问题是,我不知道如何将{}
当前文件嵌入到更复杂-exec
的示例中find . -exec grep smf {} \;
(例如,{}
仅使用一次)。如何-exec
在命令中的find中使用option,在其中您多次引用当前文件?(这将{}
花费更多时间)。
您的代码不起作用,因为您要求find
运行的实用程序if
不存在(这是Shell语法中的关键字)。
该-O
如果参数是由当前用户所拥有的文件测试为真。可以使用以下方法find
本身进行相同的测试-user "$USER"
(假设$USER
扩展到当前用户):
find . -type f ! -user "$USER"
test -O
如果您的外部test
实用程序支持该非标准测试(请选中man test
),也可以使用:
find . -type f ! -exec test -O {} \; -print
如果仍然想要或需要使用外壳程序-O
内置的测试bash
,则必须生成一个bash
外壳程序来执行测试:
find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print
bash -c
对于每个在第一个参数($1
)上运行测试的文件,这将启动一个内联脚本。参数在脚本的命令行中通过传递find
(bash
之前的字符串{}
将放置在$0
脚本内部,并且将由该Shell用于错误消息)。如果测试为真(该文件不属于您),-print
则生效并打印文件的路径名。
您可以使用以下方法更有效地执行此操作
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
这是更有效的方法,因为它将批次的找到的路径名传递给了bash -c
脚本。
...但是使用-user "$USER"
将是更好的选择。
也可以看看:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句