次の問題が発生しています。ディレクトリ構造があり、Caches
という名前のディレクトリ内にあるすべてのものを削除したい 。 Snapshots
という名前のすべてのディレクトリを除いてすべてを削除する必要があります 。 検索でこれを行う方法がわかりません または私が知っている他のコマンド。
私が尋ねる理由:iOSでは、すべてのアプリに独自のキャッシュディレクトリがあります。アプリによっては、これらが適切にクリアされない場合があります。この回答の解決策を使用すると、iOSでキャッシュをクリアできるため、デバイスのドライブが別のコンピューターにマウントされている場合に、ディスク容量を最適化できます。 FUSE(iExplorer)を使用します。
これは私がこれまでに持っているものです:
find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print
これは次のようなものを返します:
./Library/Caches
ls ./Library/Caches
を実行すると すべてのコンテンツとSnapshots
が表示されます 最終的に-delete
したいので、除外したいディレクトリ これ以外はすべて。
このようなものが欲しい:
Before: After:
. .
├── a ├── a
│ ├── a │ ├── a
│ └── Caches │ └── Caches
│ ├── a │ └── a
│ │ └── Snapshots │ └── Snapshots
│ │ └── a │ └── a
│ ├── b └── b
│ │ └── a └── c
│ └── c
└── b
├── c
└── Caches
├── a
│ └── foo
│ └── a
└── b
└── a
承認された回答:
find . -depth -print0 | perl -0lne '
if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'
find
の場合 -print0
をサポートしていません 、-exec printf '%s\0' {} +
に置き換えることができます 。
アイデアは、NULで終了するファイルのリストを印刷し(0はファイルパスで発生できない唯一のバイトであるため)、perl
を使用することです。 の-n
-0
を使用 これらのファイル名ごとにいくつかのコードを実行するオプション($_
を使用) ファイル名に設定します。
-depth
を使用 、ファイルは親ディレクトリの前に印刷されます。ファイルまたはディレクトリのみを削除します(空であると想定しているため、depth
でリストを処理することが重要です。 順序)パスに/Caches/
が含まれている場合 /Snapshosts/
が続かない 。