Saya tahu cara menghapus semua txt
file 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 txt
file 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)
?
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
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 rm
bekerja dengan baik
grep -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 dari ls
. (Hasil yang tepat mungkin tergantung pada opsi gumpalan shell.)
.txt$
akan mencocokkan string yang diakhiri dengan txt
terlepas dari titik. Karena grep
mengambil ekspresi reguler sebagai parameter. Jadi file a.txt
dan aatxt
dan a-txt
semua 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 -v
tanda 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
-I
pilihan bisa berguna, tapi lihat mengapa tidak mengurai ls . Dan apa yang | xargs
dicapai? Tanpa argumen, itu hanya berjalan echo
pada semua masukannya.
xargs
seharusnya dicapai?
Ini berfungsi juga untuk menghapus semua file dan folder tersembunyi (titik) kecuali yang dinyatakan ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
sebelumnya benar-benar mencoba meneleponrm
.