GNU/Linux >> Belajar Linux >  >> Linux

Gunakan Temukan Untuk Menemukan Direktori Tertentu Dan Hapus Semua File Di dalamnya Kecuali Satu Direktori?

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/ .


Linux
  1. Bagaimana Menggunakan Wc Dan Piping Untuk Menemukan Berapa Banyak File Dan Direktori Di Direktori Tertentu?

  2. Hapus Semua File Kecuali Di Subdirektori Tertentu Dengan Temukan?

  3. Pindahkan semua file kecuali satu

  1. Bagaimana cara memindahkan (dan menimpa) semua file dari satu direktori ke direktori lain?

  2. Temukan semua file nol-byte di direktori dan subdirektori

  3. Perintah untuk membuat daftar semua file kecuali . (titik) dan .. (titik titik)

  1. Hapus file yang cocok di semua subdirektori

  2. Bisakah Anda mengubah izin untuk semua file kecuali satu direktori di Linux?

  3. Bagaimana cara menghapus semua file dalam direktori kecuali beberapa?