すべてのサブディレクトリ(およびその中のファイル)を削除しようとしています。いいえ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 {} +
これらのコマンドはすべてコンテンツを削除します。使用前にテストしてみてください!