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?
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):
@ 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.
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):
ls
sebelumnya benar-benar mencoba meneleponrm
.Jawaban:
Anda bisa menggunakan
find
:Atau fitur globbing bash yang diperluas:
Atau dalam zsh:
sumber
*.!(txt)
seharusnya!(*.txt)
?rm
akan tersedak jika ada folder.find . -type f ! -name "*.txt" | xargs -r rm
akan berfungsi di GNU \ xargs. Perintah BSD dan UNIX xargs mungkin tidak memiliki -r Anda harus memeriksa lokal Andaman xargs
ada banyak cara yang bisa dilakukan. tapi cara paling sederhana adalah (bash):
sumber
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 {} \;
sumber
Satu solusi tanpa
find
:Ini harus bekerja pada semua jenis kerang.
sumber
Anda dapat menggunakan grep dan xargs terbalik
sumber
ls | grep -v *.txt | xargs rm
bekerja dengan baikgrep -v *.txt
hanya akan berfungsi jika hanya ada satu.txt
file. Jika tidak ada,grep
akan digunakan*.txt
sebagai polanya; jika ada lebih dari satu, ia akan mencari nama file pertama di dalam semua.txt
file lain , mengabaikan keluaran darils
. (Hasil yang tepat mungkin tergantung pada opsi gumpalan shell.).txt$
akan mencocokkan string yang diakhiri dengantxt
terlepas dari titik. Karenagrep
mengambil ekspresi reguler sebagai parameter. Jadi filea.txt
danaatxt
dana-txt
semua akan cocok dengan ungkapan ini. Ekspresi yang benar seharusnyals | 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 inils | grep \\.txt$ | xargs --no-run-if-empty echo
(catatan: tidak ada-v
tanda danrm=>echo
). Note2: Anda mungkin telah melihat double backslash. Satu untuk regex, yang lain untuk bash untuk menghindari tebasan.Cukup lakukan:
rm $(ls -I "*.txt" )
Jenis file #Deletes kecuali * .txtDemikian juga, jika perlu menghapus "kecuali satu jenis file atau lebih", lakukan:
rm $(ls -I "*.txt" -I "*.pdf" )
#Hapus jenis file kecuali * .txt & * .pdfsumber
-I
pilihan bisa berguna, tapi lihat mengapa tidak mengurai ls . Dan apa yang| xargs
dicapai? Tanpa argumen, itu hanya berjalanecho
pada semua masukannya.xargs
seharusnya dicapai?Ini berfungsi juga untuk menghapus semua file dan folder tersembunyi (titik) kecuali yang dinyatakan (
.mydir
):sumber