Saya perlu menghapus semua data yang dikompilasi:
- direktori yang disebut
build
, - direktori yang disebut
obj
, - *. jadi file.
Saya menulis sebuah 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
find
seperti ini denganfind /search_directory options
mengabaikan direktori pencarian bukan ide yang baikJawaban:
Gunakan
-prune
pada direktori yang akan Anda hapus untuk memberi tahufind
agar tidak repot mencari file di dalamnya:Perhatikan juga bahwa
*.so
perlu dikutip karena jika tidak dapat diperluas oleh shell ke daftar.so
file dalam direktori saat ini.Setara dengan
-regex
tipe GNU Anda adalah:Perhatikan bahwa jika Anda akan menggunakan sintaksis khusus GNU, sebaiknya Anda gunakan
-delete
sebagai ganti-exec rm -rf {} +
. Dengan-delete
, GNUfind
menyala-depth
secara otomatis. Itu tidak menjalankan perintah eksternal sehingga dengan cara itu, itu lebih efisien, dan juga lebih aman karena menghapus kondisi balapan di mana seseorang mungkin dapat membuat Anda menghapus file yang salah dengan mengubah direktori ke symlink di antara waktufind
menemukan file danrm
menghapusnya (lihatinfo -f find -n 'Security Considerations for find'
detailnya).sumber
-delete
juga menangani hal-hal seperti spasi lebih baik-exec rm -rf {} +
yang tidak memiliki masalah dengan itu juga.{}
- haruskah mereka dikutip atau tidak? Tampaknya berfungsi tanpa tanda kutip, tetapi Manual GNU Findutils menggunakan'{}'
contohnya. Bisakah Anda menjelaskan?csh
, tetapi saya tidak pernah bisa memverifikasi klaim itu. Mereka tidak diperlukan di shell modern yang saya tahu. Jelas tidak diperlukan oleh POSIX. The POSIX contoh tidak menggunakannya.-delete
tidak dapat digunakan dengan direktori.Saya kira alasannya adalah bahwa
find
menghapus pohon direktori terlebih dahulu dan mencoba memeriksa isi direktori yang jelas bukan urutan terbaik. Anda dapat memaksafind
untuk memeriksa konten terlebih dahulu:Anda harus mempertimbangkan
-delete
untuk menggunakan file dan-exec rmdir
direktori.sumber
Solusi saya.
+ vs \; dalam perintah -exec
sumber
-exec … {} +
mengeksekusi perintah untuk beberapa file sekaligus, sebanyak yang sesuai pada baris perintah. Jika ada terlalu banyak file (atau lebih tepatnya jika panjang total path terlalu panjang),find
akan mengeksekusi beberapa instancerm
, dan dengan demikian dapat menghapus direktori yang dilaluinya. Kemungkinannya kecil+
dibandingkan dengan;
tetapi+
tidak menyelesaikan masalah.