Pertanyaan Tidak termasuk file dan direktori tertentu saat menghapus file


Direktori level teratas saya data. data termasuk beberapa direktori dan direktori ini memiliki sub-direktori. Saya perlu menghapus semua file dan direktori di dalamnya data/ kecuali beberapa file di beberapa direktori.

Sebagai contoh, data termasuk direktori 100 dan 101. Saya hanya ingin mempertahankannya a.txt dan b.txt file dalam 100/ dan c.txt dan d.txt file dalam 101/ saat menghapus semua file dan direktori lain di 100 dan 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) tetapi saya tidak bisa menerapkan perintah ini untuk setiap direktori secara otomatis.


9
2018-01-02 12:47


asal




Jawaban:


Seperti yang sudah Anda ketahui, Anda bisa menggunakan extglob fitur 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)

Ini adalah ide yang bagus untuk mengujinya echo pertama. Contoh ini akan cocok dengan apa pun di dalamnya 100/ yang mana bukan a.txt atau b.txt dan apa pun di dalam 101/ yang mana bukan c.txt atau d.txt. Jika aturannya sama 100/ berlaku untuk 102/ Anda juga bisa melakukan misalnya:

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

10
2018-01-02 13:02



Saya hanya memberikan contoh untuk 100 dan 101 direktori tetapi dalam 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 (sunting), terutama tidak jelas bagaimana caranya rm harus tahu file mana yang harus disimpan di direktori mana jika Anda tidak ingin menentukannya. - dessert


Anda bisa menggunakannya find untuk ini. Anda dapat meniadakan tes find dengan -not atau !. Ini akan mengecualikan pertandingan, daripada menemukannya.

Anda harus berhati-hati untuk tidak menghapus salah satu direktori induk dari file yang ingin Anda simpan, terutama direktori saat ini  ., jadi pastikan Anda membaca hasilnya secara menyeluruh sebelum menghapus.

Berdasarkan contoh Anda, Anda dapat melakukan sesuatu seperti ini dari data direktori.

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

Tambah sebuah ! -path ./path/to/dir untuk jalur apa pun yang Anda ingin hindari menghapus. Anda dapat menggunakan metakarakter seperti *, tetapi pastikan Anda mengutip ekspresi jika Anda melakukannya, misalnya "./path*dir", untuk mencegah ekspansi yang tidak diinginkan.

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

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

Ini tidak akan ditemukan a.txt atau b.txt atau foo, tetapi akan menemukan semua file lain.

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

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

6
2018-01-02 13:13