macOSで「find ... -delete」を実行すると、「相対パスが安全ではない可能性がある」エラー

macOSで「find ... -delete」を実行すると、「相対パスが安全ではない可能性がある」エラー

次の特定のテキストを含むすべてのファイルを削除しようとしています。

$ 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

macOSは、引数として提供されたファイルを削除しない以前のfindバージョンのFreeBSDに基づいています。find-delete

これを行うとき:

find dir/* ... -delete

あなたのシェルglobはdir/*ファイルパスのリスト(隠しパスを除く、findこのディレクトリで見つかった隠しファイルを除外しない)に展開されるため、次findの内容が表示されます。

find dir/dir1 dir/dir2 dir/file1 dir/file2... ... -delete

dir/file1一致した場合、macOSは削除を拒否findします。一致した場合はaを削除します。-deletedir/dir1/.somefile

それは2013年のFreeBSDの変更しかし、この変更はmacOSには表示されていないようです。ここで解決策は簡単です。代わりにfind dir(またはディレクトリへのシンボリックリンクとしてfind dir/許可し、そのディレクトリにドロップしたい場合)、次の手順を実行します。dirfindfind dir/*

find ~/Library/MobileDevice/Provisioning\ Profiles/ \
  -exec grep -l "text to search for" '{}' \; -delete

または使用より効率的なgrep -l --null | xargs -0方法

答え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

関連情報