ディレクトリのすべての内容と一部の除外内容を削除しようとしています。私は現在これを使用しています:
find . -type f | grep -vZf ../../exclude.file | xargs rm -rf
これには以下がexclude.file
含まれます。
*log*
world*
crash-reports
banned-ips*
world
、フォルダ、またはその内容を削除したくありません(*はで作成されたバックアップを上書きしますlog
)。crash-reports
world.zip
上記のコマンドはこれを行いますが、空でないディレクトリは削除しません。たとえば、Config
ディレクトリは保存されていますが、削除する必要があります。
私も次のことを試しました。
find -maxdepth 0 -not -name '*log*' -not -name 'crash-reports' -not -name 'world*' | xargs rm -rf
しかし、私はまだ同じ結果を得ます。
これを行う方法はありますか?
答え1
-type f
ディレクトリは検索できず、ファイルのみを検索できます。-maxdepth 0
検索しているディレクトリのみが検索されます(.
)。実際に渡したいファイルを見つける必要がありますrm
。
標準的なアプローチは、ディレクトリを除外することです。そしてそのすべて次のようになります(テストされていません!)。
find . -mindepth 1 \( -name '*log*' -o -name 'crash-reports' -o -name 'world*' \) -prune -o -print
答え2
find
IMHO、スキップしたいすべてのディレクトリが最初のディレクトリレベルにあることを知らない限り、単一の実行で目的を達成することは不可能です。
最初のステップ
最初の実行時にすべてのファイル(またはディレクトリ以外のファイル)を削除します。
find . \( -type d \
\( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
-prune \) -o \( -type d -o -print \)
ステップ2
スキップする各(サブ)ディレクトリにダミーファイルを作成します。
find . -type d \( \
\( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
-o \( -path '*/*log*/*' -o -path '*/world*/*' -o -path '*/crash-reports/*' -o -path '*/banned-ips*/*' \) \) \
-exec touch {}/dontdeletethisdirecory
第三段階
これで、すべての空のディレクトリを削除できます。簡単な方法は、すべてのディレクトリをに渡しrmdir
て空のディレクトリのみを削除することです。
find . -depth -type d -exec rmdir {} \;
オプションの最後のステップ
これでダミーファイルを削除できます。
find . -type -f -name dontdeletethisdirecory -delete