Saya mengalami masalah berikut. Saya memiliki struktur direktori dan ingin menghapus semua yang ada di dalam direktori bernama Caches
. Semuanya harus dihapus kecuali semua direktori bernama Snapshots
. Saya tidak tahu bagaimana melakukannya dengan temukan atau perintah lain yang saya tahu.
Alasan saya bertanya:Di iOS, setiap aplikasi memiliki direktori Cache sendiri. Ini terkadang tidak dibersihkan dengan benar, tergantung pada aplikasinya. Dengan solusi untuk jawaban ini, seseorang akan dapat menghapus Cache di iOS, dan karenanya mengoptimalkan ruang disk, ketika drive perangkat dipasang di komputer lain, mis. dengan FUSE (iExplorer).
Inilah yang saya miliki sejauh ini:
find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print
Ini mengembalikan sesuatu seperti:
./Library/Caches
Ketika saya melakukan ls ./Library/Caches
Saya melihat semua konten dan Snapshots
direktori, yang ingin saya kecualikan karena pada akhirnya saya ingin -delete
semuanya kecuali yang ini.
Saya ingin sesuatu seperti ini:
Before: After:
. .
├── a ├── a
│ ├── a │ ├── a
│ └── Caches │ └── Caches
│ ├── a │ └── a
│ │ └── Snapshots │ └── Snapshots
│ │ └── a │ └── a
│ ├── b └── b
│ │ └── a └── c
│ └── c
└── b
├── c
└── Caches
├── a
│ └── foo
│ └── a
└── b
└── a
Jawaban yang Diterima:
find . -depth -print0 | perl -0lne '
if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'
Jika find
tidak mendukung -print0
, Anda bisa menggantinya dengan -exec printf '%s\0' {} +
.
Idenya adalah untuk mencetak daftar file yang diakhiri NUL (karena 0 adalah satu-satunya byte yang tidak dapat muncul di jalur file) dan gunakan perl
-n
dengan -0
opsi untuk menjalankan beberapa kode untuk setiap nama file tersebut (dengan $_
atur ke nama file).
Dengan -depth
, file dicetak sebelum direktori induknya. Kami hanya menghapus file atau direktori (dengan asumsi mereka kosong, itulah sebabnya penting untuk memproses daftar di depth
order) jika jalurnya berisi /Caches/
tidak diikuti oleh /Snapshosts/
.