find's -deletebendera bekerja sama dengan rmdirsaat menghapus direktori. Jika direktori tidak kosong ketika sudah mencapai itu direktori tidak dapat dihapus.
Anda harus mengosongkan direktori terlebih dahulu. Karena Anda menentukan -type d, findtidak akan melakukannya untuk Anda.
Anda dapat menyelesaikan ini dengan melakukan dua lintasan: pertama hapus semua yang ada dalam dir yang dinamai __pycache__, kemudian hapus semua dir yang bernama __pycache__:
Pada find 4.4.2, perintah terakhir itu harus find ~ -path '*/__pycache__*' -delete, atau mungkin find ~ -path '*/__pycache__/*' -o -name __pycache__ -deleteaman.
naught101
3
@ naught101, yang harus find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -deletesebagai dan memiliki hak lebih atau .
Stéphane Chazelas
6
Ada beberapa alasan potensial untuk ini.
1)
Anda menyuruhnya menghapus direktori saja ( -type d), dan direktori itu masih memiliki file di dalamnya.
2)
Direktori Anda hanya berisi direktori lain, sehingga -type dakan menangani masalah konten. Namun Anda menggunakan OS-X, yang sebagian besar didasarkan pada FreeBSD, dan FreeBSD findsecara default akan memproses direktori sebelum isinya.
Namun -depthada opsi untuk mengatasi masalah ini dengan mengatakan finduntuk memproses direktori setelah isinya.
find ~ -name __pycache__ -type d -ls -delete -depth
Masalah ini tidak ada di linux karena -deleteopsi secara implisit memungkinkan -depth.
FreeBSD man 1 find:
-depth Always true; same as the non-portable -d option. Cause find to
perform a depth-first traversal, i.e., directories are visited in
post-order and all entries in a directory will be acted on before
the directory itself. By default, find visits directories in
pre-order, i.e., before their contents. Note, the default is not
a breadth-first traversal.
GNU man 1 find:
-depth Process each directory's contents before the directory itself. The -delete
action also implies -depth.
Yeah, tapi FreeBSD find (1) mengatakan untuk -delete, “pengolahan traversal ... Depth-first tersirat oleh pilihan ini.”, Dan GNU find (1) mengatakan, “... -delete menyiratkan mendalam , ...”, jadi seharusnya tidak diperlukan untuk menambah -depthperintah.
G-Man Mengatakan 'Reinstate Monica'
1
Dari findmanual GNU : "Untuk mencegah kebingungan, opsi global harus ditentukan pada baris perintah setelah daftar titik awal, tepat sebelum pengujian pertama, opsi posisi atau tindakan. Jika Anda menentukan opsi global di beberapa tempat lain, cari akan mengeluarkan pesan peringatan yang menjelaskan bahwa ini bisa membingungkan. " Sekarang, -deleteadalah "opsi global" setelah ~dalam perintah yang diberikan. Saya juga memperhatikan bahwa tidak ada bedanya apakah Anda menambahkan -depthatau tidak. Direktori kosong tetap tidak terhapus (tapi itu mungkin karena saya gunakan -maxdepthjuga)
find ~ -path '*/__pycache__*' -delete
, atau mungkinfind ~ -path '*/__pycache__/*' -o -name __pycache__ -delete
aman.find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -delete
sebagai dan memiliki hak lebih atau .Ada beberapa alasan potensial untuk ini.
1) Anda menyuruhnya menghapus direktori saja (
-type d
), dan direktori itu masih memiliki file di dalamnya.2) Direktori Anda hanya berisi direktori lain, sehingga
-type d
akan menangani masalah konten. Namun Anda menggunakan OS-X, yang sebagian besar didasarkan pada FreeBSD, dan FreeBSDfind
secara default akan memproses direktori sebelum isinya.Namun
-depth
ada opsi untuk mengatasi masalah ini dengan mengatakanfind
untuk memproses direktori setelah isinya.Masalah ini tidak ada di linux karena
-delete
opsi secara implisit memungkinkan-depth
.FreeBSD
man 1 find
:GNU
man 1 find
:sumber
-delete
, “pengolahan traversal ... Depth-first tersirat oleh pilihan ini.”, Dan GNU find (1) mengatakan, “... -delete menyiratkan mendalam , ...”, jadi seharusnya tidak diperlukan untuk menambah-depth
perintah.find
manual GNU : "Untuk mencegah kebingungan, opsi global harus ditentukan pada baris perintah setelah daftar titik awal, tepat sebelum pengujian pertama, opsi posisi atau tindakan. Jika Anda menentukan opsi global di beberapa tempat lain, cari akan mengeluarkan pesan peringatan yang menjelaskan bahwa ini bisa membingungkan. " Sekarang,-delete
adalah "opsi global" setelah~
dalam perintah yang diberikan. Saya juga memperhatikan bahwa tidak ada bedanya apakah Anda menambahkan-depth
atau tidak. Direktori kosong tetap tidak terhapus (tapi itu mungkin karena saya gunakan-maxdepth
juga)