Tidak termasuk file dan direktori tertentu saat menghapus file

11

Direktori tingkat atas saya adalah data. datatermasuk beberapa direktori dan direktori ini memiliki sub-direktori. Saya perlu menghapus semua file dan direktori di dalam data/kecuali beberapa file di beberapa direktori.

Sebagai contoh, data termasuk direktori 100dan 101. Saya hanya ingin menyimpan a.txtdan b.txtfile dalam 100/dan c.txtdan d.txtfile 101/sambil menghapus semua file dan direktori lainnya di 100dan 101.

Contoh:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

Saya menggunakan rm -rf !(a.txt|b.txt)perintah tetapi saya tidak bisa menerapkan perintah ini untuk setiap direktori secara otomatis.

biru tua
sumber

Jawaban:

12

Seperti yang sudah Anda ketahui, Anda dapat menggunakan extglobfitur yang diaktifkan dengan:

shopt -s extglob

Ini memungkinkan untuk mengecualikan kecocokan sehingga Anda dapat melakukan hal-hal seperti:

rm 100/!([ab].txt) 101/!([cd].txt)

Sebaiknya Anda mengujinya echoterlebih dahulu. Contoh ini akan cocok dengan apa pun di dalamnya 100/yang bukan a.txtatau b.txtdan apa pun di dalamnya 101/yang bukan c.txtatau d.txt. Jika aturan yang sama 100/berlaku 102/juga untuk Anda dapat lakukan misalnya:

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)
pencuci mulut
sumber
Saya baru saja memberikan contoh untuk 100 dan 101 direktori tetapi pada kenyataannya jumlah sub-direktori hampir 20. Apakah ada cara untuk menerapkan kode di atas untuk setiap direktori tanpa menulis setiap nama direktori di folder utama?
deepblue
@deepblue Berikan contoh yang tepat untuk itu dalam pertanyaan Anda ( edit ), terutama tidak jelas bagaimana rmseharusnya mengetahui file mana yang harus disimpan di direktori mana jika Anda tidak ingin menentukannya.
hidangan penutup
7

Anda bisa menggunakannya finduntuk ini. Anda dapat meniadakan tes finddengan -notatau !. Ini akan mengecualikan pertandingan, daripada menemukan mereka.

Anda harus berhati-hati untuk tidak menghapus direktori induk dari file yang ingin Anda simpan, terutama direktori saat ini . , jadi pastikan Anda membaca output dengan seksama sebelum menghapus.

Berdasarkan contoh Anda, Anda dapat melakukan sesuatu seperti ini dari datadirektori.

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

Tambahkan a ! -path ./path/to/diruntuk setiap jalur yang Anda ingin hindari menghapus. Anda dapat menggunakan metakarakter seperti *, tetapi pastikan Anda mengutip ungkapan jika Anda melakukannya, misalnya "./path*dir", untuk mencegah ekspansi yang tidak diinginkan.

findbersifat rekursif secara default. Bahkan jika kita tidak menemukan di ./100sini, kita akan menemukan semua isinya kecuali mereka cocok dengan polanya [ab].txt. Jika Anda tidak dapat mencocokkan semua nama yang ingin Anda pertahankan, tambahkan tes lain:

! -path "./100/[ab].txt" ! -path ./100/foo

Ini tidak akan menemukan a.txtatau b.txtatau foo, tetapi akan menemukan semua file lainnya.

Ketika Anda yakin melihat apa yang Anda inginkan, Anda dapat menambahkan -deletesampai akhir untuk menghapus file yang ditemukan:

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
Zanna
sumber