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?
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?
Jawaban:
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
*.!(txt)seharusnya !(*.txt)?
rmakan tersedak jika ada folder.
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
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 {} \;
Anda dapat menggunakan grep dan xargs terbalik
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rmbekerja dengan baik
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.)
.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.
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
-Ipilihan bisa berguna, tapi lihat mengapa tidak mengurai ls . Dan apa yang | xargsdicapai? Tanpa argumen, itu hanya berjalan echopada semua masukannya.
xargsseharusnya dicapai?
Ini berfungsi juga untuk menghapus semua file dan folder tersembunyi (titik) kecuali yang dinyatakan ( .mydir):
rm -rf $(ls -aI ".mydir")
lssebelumnya benar-benar mencoba meneleponrm.