Pertanyaan Cara menghapus semua file kecuali satu file bernama dari folder tertentu [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Inilah situasinya.

Saya memiliki direktori yang berisi banyak file dengan ekstensi yang berbeda. Saya ingin menghapus semua file kecuali satu dengan nama tertentu.

Ini dapat dengan mudah dilakukan menggunakan GUI dengan memilih semua dan menekan ctrl dan tidak memilih file yang dimaksud.

Itulah tepatnya yang saya inginkan, tetapi bagaimana saya bisa melakukannya dari baris perintah?

Sebagai contoh:  dirA berisi file-file berikut:

a.txt
b.txt
c.php
d.html
a.db
b.db
e.html

Saya ingin menghapus semua file yang hanya menyimpan file bernama a.txt.


47
2018-05-16 12:15


asal


kupikir ini mungkin menjelaskan. ;) - JoKeR
Saya sudah pernah mengalami ini sebelumnya, tetapi ini membutuhkan lebih banyak pekerjaan - Maythux
Pertanyaan-pertanyaan ini membingungkan saya, belum lagi mereka tidak tahu berapa banyak file yang ada di sistem Anda. Atau .txt, gunakan perintah ini sederhana untuk digunakan dan mudah dimengerti rm -riv ~ / Desktop / path / * * = semua di folder, r = rekursif, v = verbose, i = meminta Anda sebelum menghapus - hello moto


Jawaban:


Saya datang dengan perintah sederhana sederhana yang mudah ini:

rm !(a.txt)

Kamu dapat memakai ! sebagai sebuah negasi

Uji glob dengan gema pertama yaitu

echo !(a.txt)

Jika tidak berhasil, untuk bash Anda mungkin perlu mengaktifkan ini dengan

shopt -s extglob

Jika Anda ingin menyimpan keduanya a.txt dan b.txt, Kamu dapat memakai !(a.txt|b.txt) atau !([ab].txt).

Edit: 

untuk membuat rm bekerja secara rekursif hanya menambahkan -r seperti

rm -r !(a.txt)

dan juga, itu berfungsi dengan folder. hanya perlu mengubah nama menjadi nama dir, seperti untuk a_dir

rm -r !(a_dir)

82
2018-05-16 12:21



Apa shell ini bekerja? Apakah ini bekerja pada bash default ubuntu? EDIT: Nevermind, menemukan info, mengusulkan pengeditan. - Random832
Tampaknya tergantung pada ksh. Bash tidak suka itu. - Joshua
Hanya untuk menjadi eksplisit, apakah itu rekursif (mempengaruhi sub folder)? - Peter Mortensen
@PeterMortensen, Anda dapat menambahkan -r ke perintah rm seperti ini rm -r !(a.txt), itu akan bekerja secara rekursif - lhrec_106
Bagi saya menjalankan ini di mac itu kembali -bash: !: event not found - Jim


Anda dapat mencoba perintah ini:

find . \! -name 'a.txt' -delete

Tetapi Anda perlu berhati-hati karena perintah find bersifat rekursif.


17
2018-05-16 12:22



Anda dapat mencegah find dari rekursif dengan -maxdepth 1 - evilsoup
Re "karena perintah find bersifat rekursif." Memang, penjawab lainnya gagal menyebutkan itu. - Peter Mortensen


Anda dapat melakukan ini di terminal:

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=

11
2018-05-16 12:28



Tidak berfungsi jika Anda mengatur jalur lengkap - kinORnirvana


Anda dapat menggunakan perintah:

find ! -name 'a.txt' -type f -exec rm -f {} +

Ini akan mencari file (-type f) dalam direktori saat ini kecuali untuk file a.txt (! -name 'a.txt) dan kemudian akan menghapusnya (-exec rm -f {} +)


5
2018-05-16 12:20



Tetapi ini tidak akan menghapus direktori jika ada ?! - Maythux
@Maythux Ya, penulis menanyakan cara menghapus file, bukan folder. - shaddy
-exec rm -f {} + tidak memiliki kelebihan -delete. - Eliah Kagan


Menggunakan find dan xargs

find folder -type f -not -name 'a.txt' -print0 | xargs -0 rm

Untuk mengecualikan beberapa hal:

find folder -type f -not -name 'a.txt' -not -name 'b.txt' -print0 | xargs -0 rm

Ini juga berfungsi dengan wildcard:

find folder -type f -not -name '*.png' -not -name 'b.txt' -print0  | xargs -0 rm

Untuk mencari di folder saat ini, gunakan . di tempat 'folder'.

Sumber dasar


4
2018-05-16 12:21



Mungkin akan bagus untuk portabilitas =) +1 - Sergiy Kolodyazhnyy
Perhatikan bahwa ini akan gagal jika nama file Anda berisi spasi putih atau baris baru atau karakter global, dll. Gunakan find . -type f -not -name 'a.txt' -delete sebagai gantinya. - terdon♦