ファイルとディレクトリを名前で削除します。そのファイルやディレクトリはありません。

ファイルとディレクトリを名前で削除します。そのファイルやディレクトリはありません。

コンパイルされたデータをすべて削除する必要があります。

  • build名前があるディレクトリ
  • obj名前があるディレクトリ
  • *.so ファイル。

私は命令を書いた

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

すべてのディレクトリを再帰的に見て、必要なものをすべて削除します。

なぜこの結果が出るのですか?たぶん別のコマンドを書く必要があるかもしれません。

find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory

答え1

-prune削除するディレクトリでこれを使用して、findそのディレクトリ内のファイルを見つけようとしないでください。

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

また、*.so引用が必要です。それ以外の場合、シェルはそれを.so現在のディレクトリのファイルのリストに拡張できます。

GNUタイプと同等のものは次のとおり-regexです。

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

GNU固有の構文を使用するには、代わりに-delete使用することをお勧めします-exec rm -rf {} +。を使用すると、-deleteGNUが自動的にオンにfindなります-depth。外部コマンドを実行しないため、ディレクトリをシンボリックリンクに変更して、誰かが間違ったファイルを削除するように誘導できる競合状態を排除するので、より効率的で安全です(詳細を参照)find。 )。rminfo -f find -n 'Security Considerations for find'

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

答え2

findその理由は、まずディレクトリツリーを削除してディレクトリの内容を調べようとするためです。これは明らかに最良の順序ではありません。findまず、内容を強制的に確認できます。

find . -depth ...

-deleteファイルと-exec rmdirディレクトリについてこの点を考慮する必要があります。

答え3

私のソリューション。

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+と\; -execコマンド

関連情報