Saya perlu menghapus semua data yang dikompilasi:
- direktori bernama
build
, - direktori bernama
obj
, - *.so file.
Saya menulis perintah
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
yang melewati semua direktori secara rekursif dan menghapus semua yang saya butuhkan.
Mengapa saya memiliki output seperti itu di akhir?
Mungkin saya harus menulis perintah yang berbeda.
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
Jawaban yang Diterima:
Gunakan -prune
pada direktori yang akan tetap Anda hapus untuk memberi tahu find
tidak perlu repot mencari file di dalamnya:
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
Perhatikan juga bahwa *.so
perlu dikutip karena jika tidak, itu dapat diperluas oleh shell ke daftar .so
file di direktori saat ini.
Setara dengan -regex
GNU Anda -ketik satu adalah:
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Perhatikan bahwa jika Anda akan menggunakan sintaks khusus GNU, Anda sebaiknya menggunakan -delete
bukannya -exec rm -rf {} +
. Dengan -delete
, GNU find
menyalakan -depth
secara otomatis. Itu tidak menjalankan perintah eksternal sehingga dengan cara itu, lebih efisien, dan juga lebih aman karena menghilangkan kondisi balapan di mana seseorang mungkin dapat membuat Anda menghapus file yang salah dengan mengubah direktori ke symlink di antara waktu find
menemukan file dan rm
menghapusnya (lihat info -f find -n 'Security Considerations for find'
untuk detailnya).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete