我正在尝试删除包含特定文本的所有文件,如下所示:
$ find ~/Library/MobileDevice/Provisioning\ Profiles/* -exec grep -l "text to search for" '{}' \; -delete
/Users/build/Library/MobileDevice/Provisioning Profiles/06060826-3fb2-4d71-82c6-7b9d309b08d6.mobileprovision
find: -delete: /Users/build/Library/MobileDevice/Provisioning Profiles/06060826-3fb2-4d71-82c6-7b9d309b08d6.mobileprovision: relative path potentially not safe
但是,正如您所看到的,它会发出警告,然后不会删除该文件。我该如何解决这个错误?
这是在 Mac 上。
答案1
macOSfind
基于旧版本的 FreeBSD find
,它-delete
不会删除作为参数给出的文件。
当你这样做时:
find dir/* ... -delete
你的壳正在将该dir/*
glob 扩展为文件路径列表(不包括隐藏的路径,而find
其本身不会排除在任何这些目录中找到的隐藏文件),因此find
会收到类似以下内容的内容:
find dir/dir1 dir/dir2 dir/file1 dir/file2... ... -delete
如果dir/file1
匹配 macOSfind
的-delete
将拒绝删除它。dir/dir1/.somefile
如果匹配的话它会很乐意删除 a 。
那是2013 年 FreeBSD 发生了变化,但这一更改显然并未出现在 macOS 上。在这里,解决方法很简单:使用find dir
(或者find dir/
如果您想允许 fordir
成为目录的符号链接并find
下降到该目录)而不是find dir/*
.所以,就你而言:
find ~/Library/MobileDevice/Provisioning\ Profiles/ \
-exec grep -l "text to search for" '{}' \; -delete
答案2
我在 macOS 删除所有内容时遇到了这个问题除了从目录树归档:
find top ! -name "*.tar.gz" -print -delete
... snip ...
top
find: -delete: top: relative path potentially not safe
解决方案是添加-mindepth 1
排除顶级目录
find top/path -mindepth 1 ! -name "*.tar.gz" -print -delete
答案3
尝试:
find ~/Library/MobileDevice/Provisioning\ Profiles/ -type f -name "name to match" -delete
编辑 - 第一个代码不是问题的答案,试试这个:
find ~/Library/MobileDevice/Provisioning\ Profiles/ -type f -exec grep -l --null "pattern in file" {} + | xargs -0 rm
答案4
您需要将*
文件夹路径中的星号( )(紧随其后find
)更改为点(.
)
即,find dir/* ... -delete
==>find dir/. ... -delete