OSXでパターンを含まないサブディレクトリを繰り返し削除します。

OSXでパターンを含まないサブディレクトリを繰り返し削除します。

すべてのサブディレクトリ(およびその中のファイル)を削除しようとしています。いいえOSX で Bash を使用すると、ディレクトリ名に 2 つのパターンのいずれかが含まれます。私は複数の親ディレクトリに対してこれを再帰的に実行したいと思います。

私が望むサブディレクトリのパターンを考えてみましょう。いいえ削除は「foobar」または「doobar」です。

次の親ディレクトリがたくさんあります。

Parent001_dir
   001_boo
   002_hugs
   003_foobar
   004_doobar
   005_apple
   ...

各親ディレクトリに移動して、一致しない子ディレクトリを削除するforループコードを実行したいと思います。

私が思う動作するコード:

for i in /path/to/parent/directories/
do
find !-name "*foobar*" -o !-name "*doobar*"  -delete
done

しかし、検索マニュアルを読みましたが、オプションは表示されませんでした。いいえパターンマッチング!-name はオプションではありません。

編集 - コメントで次を試してください。

find /path/to/parent/directories/ -type d -not -name "*foobar*" -not -name "*doobar*"  -delete

「パスが安全ではない可能性があります」というメッセージが表示されます。

私のコードを修正する方法を見つけたら、「Parent001_dir」と次のような他のすべての親ディレクトリで終わることができます。

Parent001_dir
   003_foobar
   004_doobar

私のコードを修正できるワイルドカードはありますか?それともまったく異なる方法を使用する必要がありますか?助けてくれてありがとう。

ベストアンサー1

まず、ループは不要であり、findこれらすべてを独自に実行します。!または、-notフラグを使用して条件を無効にすることもできます。-oこれは、「名前がfoobarではないか、名前がdoobarではないファイル/ディレクトリを見つけること」を意味するので、あなたもそれを望んでいません。これは、1つまたは他の条件が常にtrueであるため、すべてを検索します(foobar「not doobar」と一致し、doobar「not foobar」と一致)。あなたが望むものは次のとおりです。

find /path/to/parent/dirs/* -type d ! -name "*foobar*" ! -name "*doobar*" -delete

または

find /path/to/parent/dirs/* -type -d -not -name "*foobar*" -not -name "*doobar*" -delete

必要に応じてシェルでこれを行うこともできます。たとえば、次のようにしますbash

for i in /path/to/parent/dirs/*/; do 
    [[ "$i" =~ 'foobar' || "$i" =~ 'doobar' ]] || rm -rf "$i"; 
done

詳細はわかりませんが、これをテストするMacもありませんが、OSX findではディレクトリの削除を許可していないようです。私はそれが本当だと信じています(しかし確実ではありません)このコードする:

/* Potentially unsafe - do not accept relative paths whatsoever */
if (strchr(entry->fts_accpath, '/') != NULL)
    errx(1, "-delete: %s: relative path potentially not safe",
        entry->fts_accpath);

この問題を解決する1つの方法は、次の方法を使用することです-exec

find /path/to/parent/dirs/ -type d ! -name "*foobar*" ! -name "*doobar*"  \
    -exec rm -rf {} +

これらのコマンドはすべてコンテンツを削除します。使用前にテストしてみてください!

おすすめ記事