ディレクトリとそのサブディレクトリにあるすべての* .oファイルを削除したい。ただし、エラーが発生します。
sashoalm@aspire:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory
一方、 rm *.o
は機能しますが、再帰的ではありません。
それは悪いことです:rm -r
はファイルを削除するためのものではなく、ディレクトリを削除するためのものです。幸いなことに、おそらく*.o
に一致するディレクトリはありません。
zsh
ではsh
やbash
では不可能です(bashの新しいバージョンではこれが可能ですが、shopt -s globstar
でシェルオプションglobstar
を有効にした場合のみ)。展開パターンは**/*.o
ですが、これもファイルに限定されません(zsh
には、ファイル以外を除外するためのトリックもあります)。
しかし、これはむしろfind
の場合です。
find . -type f -name '*.o' -delete
または(-delete
がPOSIXかどうかわからないため)
find . -type f -name '*.o' -exec rm {} +
これは、rm
の-r
スイッチの動作とは異なります。
-r, -R, --recursive
remove directories and their contents recursively
rm
にはファイル検索機能がありません。その-r
スイッチは、ローカルディレクトリに降りて、指定したパターンに一致するファイルを識別しません。代わりに、パターン(*.o
)はシェルによって展開され、rm
はそのパターンに一致する名前のディレクトリに移動して削除します。名前が.o
で終わるディレクトリがある場合、試行したコマンドはそれを削除しますが、サブディレクトリに.o
ファイルが見つかりません。
あなたがする必要があるのは、find
を使用することです:
find . -name '*.o' -delete
または、GNU以外の場合find
:
find . -name '*.o' -exec rm -r {} \;
または、bash
を使用している場合は、 globstar
を有効にすることができます。
shopt -s globstar
rm -r -- **/*.o
[〜#〜]注[〜#〜]:3つのオプションはすべて、名前が.o
で終わるディレクトリも削除しますあなたが望むものではなく、次のいずれかを使用してください:
find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o