Di linux, bagaimana cara menghapus semua file KECUALI pola * .txt?


74

Saya tahu cara menghapus semua txtfile di bawah direktori saat ini oleh rm *.txt. Adakah yang tahu cara menghapus semua file dalam direktori saat ini, KECUALI txt?


21
Seperti biasa, uji jawaban yang diberikan dengan perintah yang tidak berbahaya seperti lssebelumnya benar-benar mencoba menelepon rm.
— chepner

^ Orang ini tidak suka hidup berbahaya .. :)
— jDub9

Jawaban:


111

Anda bisa menggunakan find:

find . -type f ! -name '*.txt' -delete

Atau fitur globbing bash yang diperluas:

shopt -s extglob
rm *.!(txt)

Atau dalam zsh:

setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything

Beberapa di antaranya mungkin perlu disesuaikan tergantung pada apakah Anda memiliki folder dan apa yang ingin Anda lakukan dengannya.
— Kevin

1
Tidak *.!(txt)seharusnya !(*.txt)?
— Lri

@LauriRanta bergantung pada apa yang ada di folder, yang belum kami jawab. Tidak apa-apa jika semua file memiliki ekstensi, dan rmakan tersedak jika ada folder.
— Kevin

Saya punya masalah dengan tanda kurung. Ketika saya menggunakan gaya globbing dalam skrip bash, ia mengeluh tentang kesalahan sintaks dan tanda kurung. Namun melakukannya dari CLI berhasil.
— CMCDragonkai

1
@izogfif periksa ini find . -type f ! -name "*.txt" | xargs -r rmakan berfungsi di GNU \ xargs. Perintah BSD dan UNIX xargs mungkin tidak memiliki -r Anda harus memeriksa lokal Andaman xargs
— Ntwobike

10

ada banyak cara yang bisa dilakukan. tapi cara paling sederhana adalah (bash):

shopt -s extglob
rm !(*.txt)

10

Jika Anda hanya ingin menghapus semua file kecuali '* .txt' maka Anda dapat menggunakan perintah berikut:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

tetapi jika Anda juga ingin menghapus direktori bersama dengan file maka Anda dapat menggunakan ini:

$ find . ! -name "*.txt" -exec rm -r {} \;


4

Satu solusi tanpa find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

Ini harus bekerja pada semua jenis kerang.


3

Anda dapat menggunakan grep dan xargs terbalik

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rmbekerja dengan baik
— phillipsk

@ phillipsk grep -v *.txthanya akan berfungsi jika hanya ada satu .txtfile. Jika tidak ada, grepakan digunakan *.txtsebagai polanya; jika ada lebih dari satu, ia akan mencari nama file pertama di dalam semua .txtfile lain , mengabaikan keluaran dari ls. (Hasil yang tepat mungkin tergantung pada opsi gumpalan shell.)
— JigglyNaga

.txt$akan mencocokkan string yang diakhiri dengan txtterlepas dari titik. Karena grepmengambil ekspresi reguler sebagai parameter. Jadi file a.txtdan aatxtdan a-txtsemua akan cocok dengan ungkapan ini. Ekspresi yang benar seharusnya ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Untuk orang-orang yang ingin tahu: Jika Anda ingin bermain-main dengan ekspresi dengan aman gunakan ekspresi tes ini ls | grep \\.txt$ | xargs --no-run-if-empty echo(catatan: tidak ada -vtanda dan rm=>echo). Note2: Anda mungkin telah melihat double backslash. Satu untuk regex, yang lain untuk bash untuk menghindari tebasan.
— Dimitry K

1

Cukup lakukan:

rm $(ls -I "*.txt" ) Jenis file #Deletes kecuali * .txt

Demikian juga, jika perlu menghapus "kecuali satu jenis file atau lebih", lakukan:

rm $(ls -I "*.txt" -I "*.pdf" ) #Hapus jenis file kecuali * .txt & * .pdf


Selamat datang di StackExchange! The -Ipilihan bisa berguna, tapi lihat mengapa tidak mengurai ls . Dan apa yang | xargsdicapai? Tanpa argumen, itu hanya berjalan echopada semua masukannya.
— JigglyNaga

Apa yang xargsseharusnya dicapai?
— Dhag

Terima kasih, xargs tidak berguna dalam kasus di atas, sudah diperbaiki sekarang.
— Surya

0

Ini berfungsi juga untuk menghapus semua file dan folder tersembunyi (titik) kecuali yang dinyatakan ( .mydir):

rm -rf $(ls -aI ".mydir")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.