我想找到所有不属于我的文件(即没有权限修改它)。我努力了
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
但是如果我将整个命令放在-exec
引号中,如下所示:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
这都不起作用,因为对当前文件的引用{}
用引号引起来,因此不会扩展到该文件。
问题是,我不知道如何将{}
当前文件嵌入到比简单的更复杂的文件-exec
中find . -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
,那么您必须生成一个bash
shell 来执行测试:
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"
将是更好的选择。
也可以看看: