Bagaimana cara menghapus semua file dalam folder kecuali hanya beberapa file yang ditentukan?

11

Saya ingin menghapus semua file dalam direktori sambil meninggalkan hanya beberapa file yang ditentukan, mereka tidak memiliki kesamaan nama. Bagaimana saya bisa mencapainya?

Misalnya, nama file yang ingin saya simpan adalah:

file_1.png, another_file.jpg,some_music.mp3

AGamePlayer
sumber

Jawaban:

14

Jika Anda menggunakan bash:

shopt -s extglob
rm -- !(file1|file2|file3)

Baris pertama hanya mengaktifkan pencocokan pola yang diperluas, dan setelah itu kami menggunakan salah satunya:

!(pattern-list) cocok dengan apa pun kecuali salah satu pola yang diberikan

dan daftar pola adalah daftar satu atau lebih pola yang dipisahkan oleh a |.


Atau dengan zsh

setopt extendedglob
rm -- ^(file1|file2)

Atau, lebih portabel, menggunakan find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
jimmij
sumber
3
Mungkin bermanfaat untuk memasukkan cara mengembalikan kembali perilaku shell opsional ( shopt -u extglob).
geedoubleya
7

Buat subdirektori tmp, pindahkan semua file yang ingin Anda simpan ke direktori itu dan lakukan rm -f *setelahnya. Itu tidak akan mempengaruhi tmpdirektori.

Setelah itu lakukan saja:

mv tmp/* .
rmdir tmp

(Dengan asumsi tidak ada file yang Anda pindahkan dimulai dengan titik).

Ini adalah salah satu dari beberapa kasus di mana masuk akal untuk menggunakan mouse dan browser file seperti Nautilus di mana Anda benar-benar dapat Ctrl-klik beberapa file yang ingin Anda simpan dan kemudian gunakan menu: Edit -> Invert Selectionuntuk mendapatkan file lain dan kemudian menghapusnya .

Anthon
sumber
memindahkan file ke direktori tmp terdengar bagus. Bagaimanapun, saya harus melakukan ini dengan baris perintah. Terima kasih!
AGamePlayer
3
@AwQiruiGuo Tmp memiliki keuntungan bahwa ia pertama-tama memisahkan file menjadi dua set, sebelum menghapus yang tidak dapat dibatalkan. Jadi, Anda dapat menjalankan lsuntuk melihat apakah Anda tidak melewatkan file yang ingin Anda pertahankan.
Anthon
2

Tambahkan nama file yang ingin Anda simpan ke file teks, satu per baris. File ini seharusnya tidak ada di direktori atau Anda harus menambahkan namanya juga.

Jika nama direktori Anda adalah foo dan nama file adalah bar , lakukan hal berikut.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

Ini melakukan hal berikut:

  1. find -type fmencari nama semua file di foo dan subdirektori dan mencetaknya ke STDOUT. Dengan opsi -print0itu membatasi nama file dengan byte NUL.
  2. grep -v -f barmengecualikan semua nama file yang cocok dengan baris di bar . Dengan opsi -zitu memperlakukan inputnya sebagai seperangkat garis yang dibatasi oleh byte NUL, dengan opsi -Zitu membatasi outputnya dengan byte NUL.
  3. xargs rmpanggilan rmberulang kali untuk menghapus file. Dengan opsi -0itu memperlakukan inputnya sebagai seperangkat garis yang dibatasi oleh NUL byte.

Ini berfungsi dengan nama file yang mengandung spasi.

Mathias Weidner
sumber
Ini tidak akan berfungsi karena nama file dapat memiliki baris baru di dalamnya.
Anthon
@Anthon mengubah opsi find, grep, xargs untuk mengatasi nama file yang mengandung spasi, termasuk baris baru
Mathias Weidner
Jika Anda ingin menggunakan findsaya lebih suka melakukannyafind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij