GNU/Linux >> Belajar Linux >  >> Linux

Hapus semua folder di dalam folder kecuali satu dengan nama tertentu

Ini akan menghapus semua folder di dalam ./myfolder kecuali ./myfolder/test2 itu dan semua isinya akan dipertahankan:

find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete

Cara kerjanya

  • find memulai perintah find.
  • ./myfolder memberitahu find untuk memulai dengan direktori ./myfolder dan isinya.

  • -mindepth 1 tidak cocok dengan ./myfolder itu sendiri, hanya file dan direktori di bawahnya.

  • ! -regex '^./myfolder/test2\(/.*\)?' memberi tahu find untuk mengecualikan (! ) file atau direktori apa pun yang cocok dengan ekspresi reguler ^./myfolder/test2\(/.*\)? . ^ cocok dengan awal nama jalur. Ekspresi (/.*\)? cocok dengan (a) garis miring diikuti dengan apa saja atau (b) tidak sama sekali.

  • -delete memberi tahu find untuk menghapus file yang cocok (yaitu, tidak dikecualikan).

Contoh

Pertimbangkan struktur direktori yang terlihat seperti;

$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

Kita dapat menjalankan perintah find (tanpa -delete ) untuk melihat kecocokannya:

$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3

Kami dapat memverifikasi bahwa ini berfungsi dengan melihat file yang tersisa:

$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

Menggunakan bash:

shopt -s extglob
rm -r myfolder/!(test2)/

Contoh:

$ tree myfolder/
myfolder/
├── test1
│   └── file1
├── test2
│   └── file2
└── test3
    └── file3

$ echo rm -r myfolder/!(test2)
rm -r myfolder/test1 myfolder/test3
$ rm -r myfolder/!(test2)
$ tree myfolder/
myfolder/
└── test2
    └── file2

1 directory, 1 file

tl;dr

find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 \
     -exec echo rm -rf '{}' \;

Hapus gema jika puas dengan daftar file.

Menggunakan -mindepth 1 akan memastikan bahwa atas direktori tidak dipilih.

$ find ./myfolder -mindepth 1 -type d
./myfolder/test2
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

Tapi -not -name test2 akan tidak hindari subdirektori di dalam test2 :

$ find ./myfolder -mindepth 1 -type d -not -name 'test2'
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

Untuk melakukannya, Anda memerlukan sesuatu seperti pangkas:

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

Tapi jangan gunakan delete , seperti yang tersirat depth dan itu akan mulai dihapus dari jalur terpanjang:

$ find ./myfolder -depth -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test/a1/a2/a3
./myfolder/test/a1/a2
./myfolder/test/a1
./myfolder/test

Gunakan rm -rf (hapus echo jika Anda ingin benar-benar menghapus):

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
rm -rf ./myfolder/test/a1
rm -rf ./myfolder/test/a1/a2
rm -rf ./myfolder/test/a1/a2/a3

Atau, juga gunakan maxdepth jika yang Anda butuhkan hanyalah menghapus direktori (dan semua yang ada di dalamnya) (hapus echo untuk benar-benar menghapus):

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test

A -delete masih akan gagal jika direktori tidak kosong:

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty

Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Bagaimana Cara Menghapus Semua File Kecuali Satu File Bernama Dari Folder Tertentu?

  3. Hapus Semua File Dan Folder Di /tmp Lebih Lama Dari Sehari?

  1. Cara menghapus folder dengan nama tertentu

  2. Bagaimana cara menghapus file dengan nama ini di linux:-]???????q

  3. Bagaimana cara mengetahui dari folder mana suatu proses sedang berjalan?

  1. 3 Cara Menghapus Semua File di Direktori Kecuali Satu atau Beberapa File dengan Ekstensi

  2. Cara Menghapus Semua File Dalam Folder Kecuali Satu File Tertentu Di Linux

  3. Pekerjaan Cron untuk menghapus semua file yang lebih lama dari 7 hari dengan ekstensi di folder tertentu - tidak berfungsi