一部のディレクトリを除いて空でなくても、ファイルとディレクトリを削除します。

一部のディレクトリを除いて空でなくても、ファイルとディレクトリを削除します。

ディレクトリのすべての内容と一部の除外内容を削除しようとしています。私は現在これを使用しています:

find . -type f | grep -vZf ../../exclude.file | xargs rm -rf

これには以下がexclude.file含まれます。

*log*
world*
crash-reports
banned-ips*

world、フォルダ、またはその内容を削除したくありません(*はで作成されたバックアップを上書きしますlog)。crash-reportsworld.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

findIMHO、スキップしたいすべてのディレクトリが最初のディレクトリレベルにあることを知らない限り、単一の実行で目的を達成することは不可能です。

最初のステップ

最初の実行時にすべてのファイル(またはディレクトリ以外のファイル)を削除します。

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

関連情報