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?

Senjata api
sumber
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
Kevin
sumber
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)
Kent
sumber
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 {} \;

Sagar Rakshe
sumber
4

Satu solusi tanpa find:

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

Ini harus bekerja pada semua jenis kerang.

michas
sumber
3

Anda dapat menggunakan grep dan xargs terbalik

ls | grep -v .txt$| xargs rm
rjv
sumber
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

Surya
sumber
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")
Chetabahana
sumber