cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- Perintah pertama akan membawa Anda ke direktori di mana Anda ingin menghapus file Anda
- Perintah kedua akan menghapus semua file kecuali yang berakhiran dengan
.pdf
nama file
Misalnya, jika ada direktori yang dipanggil temp
di folder rumah Anda:
cd ~/temp
lalu hapus file:
find . -type f ! -iname "*.pdf" -delete
Ini akan menghapus semua file kecuali xyz.pdf
.
Anda dapat menggabungkan dua perintah ini untuk:
find ~/temp -type f ! -iname "*.pdf" -delete
.
adalah direktori saat ini. !
berarti mengambil semua file kecuali yang ada .pdf
di akhir. -type f
hanya memilih file, bukan direktori. -delete
berarti menghapusnya.
CATATAN: perintah ini akan menghapus semua file (kecuali file pdf tetapi termasuk file tersembunyi) dalam direktori saat ini serta di semua sub-direktori. !
harus datang sebelumnya -name
. hanya -name
akan mencakup saja .pdf
, sementara -iname
akan mencakup keduanya .pdf
dan.PDF
Untuk menghapus hanya di direktori saat ini dan tidak di sub-direktori tambahkan -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.
berarti "dan"?!
berarti "kecuali"-name
menandakan bahwa Anda ingin mengecualikan dengan parameter nama dan kemudian-delete
adalah tindakan yang harus diambil setelah menemukan? Jadi mencari semuanya kecuali "* .pdf" dan menghapusnya? Atau apakah saya salah paham?.
berarti direktori saat ini.!
artinya mengambil semua file kecuali yang ada.pdf
di akhir.-delete
berarti menghapusnya. apakah saya jelas sekarang?-maxdepth 1
parameter untuk memulai. Kemudian sarankan untuk menghapus parameter jika seseorang ingin menghapus secara rekursif.-iname
bukan-name
, atau file dengan.PDF
sebagai perpanjangan akan lolos.Dengan
bash
perpanjangan shell, Anda bisa menghapus file apa pun dengan ekstensi selain.pdf
menggunakanSebagaimana dicatat oleh @pts,
--
karakter menunjukkan akhir dari opsi perintah apa pun, membuat perintah aman dalam kasus yang jarang terjadi dari file yang namanya dimulai dengan-
karakter.Jika Anda ingin menghapus file tanpa ekstensi apa pun serta ekstensi selain
.pdf
, maka seperti yang ditunjukkan oleh @DennisWilliamson, Anda dapat menggunakanPerpanjangan globbing harus diaktifkan secara default, tetapi jika tidak Anda dapat melakukannya dengan menggunakan
Terutama jika Anda berniat untuk menggunakan ini di dalam skrip, penting untuk dicatat bahwa jika ekspresi tidak cocok dengan apa pun (yaitu jika tidak ada file non-pdf dalam direktori), maka secara default glob akan diteruskan tidak diperluas ke
rm
perintah, menghasilkan kesalahan sepertiAnda dapat mengubah perilaku default ini menggunakan
nullglob
opsi shell, namun itu memiliki masalah sendiri. Untuk diskusi yang lebih menyeluruh lihat NullGlob - Greg's Wikisumber
rm *~*.pdf
!(*.py)
. Juga, mungkin, jika OP hanya menginginkan file ".pdf" tersisa, maka file tanpa ekstensi juga harus dihapus dan tidak diabaikan.Hapus ke sampah :
Atau melalui
mv
perintah (tetapi dengan cara ini Anda tidak dapat mengembalikannya dari Sampah karena tidak merekam informasi .trashinfo, jadi ini berarti Anda memindahkan file Anda ke tujuan di mana itu adalah sebagai berikut).sumber
rm
.Pendekatan termudah: Buat direktori lain di suatu tempat (jika Anda hanya menghapus dalam satu direktori, tidak secara rekursif, itu bahkan bisa menjadi subdirektori); pindahkan semua .pdf di sana; hapus yang lainnya; pindahkan kembali pdf; hapus direktori perantara.
Cepat, mudah, Anda dapat melihat apa yang Anda lakukan. Pastikan direktori perantara ada di perangkat yang sama dengan direktori yang Anda bersihkan sehingga gerakannya adalah penggantian nama, bukan salinan!
sumber
Gunakan bash's GLOBIGNORE:
Dari halaman manual bash:
Tes cepat:
Keluaran:
sumber
Hati-hati dan menulis: gunakan xargs
Berikut ini pendekatan yang saya sukai, karena ini membuat saya sangat berhati-hati: menulis cara untuk menunjukkan file yang ingin saya hapus, kemudian mengirimkannya untuk
rm
digunakanxargs
. Sebagai contoh:ls
Tunjukkan semuanyals | grep pdf
menunjukkan kepada saya file yang ingin saya simpan. Hmm.ls | grep -v pdf
menunjukkan yang sebaliknya: semua kecuali yang ingin saya simpan. Dengan kata lain, ini menunjukkan daftar hal yang ingin saya hapus. Saya dapat mengkonfirmasi ini sebelum melakukan sesuatu yang berbahaya.ls | grep -v pdf | xargs rm
mengirimkan daftar itu kerm
untuk dihapusSeperti yang saya katakan, saya terutama suka ini untuk keselamatan yang disediakannya: tidak disengaja
rm *
bagi saya. Dua keuntungan lain:ls
ataufind
untuk mendapatkan daftar awal, seperti yang Anda inginkan. Anda dapat menggunakan apa pun yang Anda suka dalam proses mempersempit daftar itu - yang laingrep
, beberapaawk
, atau apa pun. Jika Anda hanya perlu menghapus file yang namanya mengandung warna, Anda dapat membuatnya dengan cara yang sama.find
untuk menemukan danrm
untuk menghapus, daripada harus ingat yangfind
menerima-delete
bendera. Dan jika Anda melakukan ini, sekali lagi, Anda dapat membuat solusi alternatif; mungkin alih-alihrm
, Anda bisa membuattrash
perintah yang memindahkan file ke tempat sampah (memungkinkan "undeletion") dan menyalurkannya ke sanarm
. Anda tidak perlu memilikifind
dukungan opsi itu, Anda hanya perlu melakukannya.Memperbarui
Lihat komentar oleh @pabouk untuk bagaimana memodifikasi ini untuk menangani beberapa kasus tepi, seperti jeda baris dalam nama file, nama file seperti
my_pdfs.zip
, dll.sumber
pdf
namanya. --- b) Ini akan menghapus file PDF jika salah satu huruf dalam sufiks adalah huruf besar. --- c) Bukan ide yang baik untuk menggunakan output darils
. Itu tidak akan bekerja dengan nama file yang mengandung baris baru. Beberapa implementasils
ganti karakter khusus misalnya tab oleh?
. --- Lebih baik untuk digunakan:find -maxdepth 1 -print0
. (tidak sesingkatls
:) ----- Untuk menyelesaikan a) dan b) gunakangrep -vi '\.pdf$'
--- solusi lengkap (tapi hanya GNU):find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
setidaknya melihat apakah itu terlihat benar, sedangkan jika Anda hanyarm my_pattern
, Anda tidak memiliki kesempatan untuk menemukan kesalahan besar.find . -type f ! -name "*.pdf"
untuk mencetak ke konsol, atau pipa ke file yang lebih sedikit atau. [dan kemudian pipa ke xargs ke rm jika diinginkan seperti komentar pabouk (dengan -print0 | ... -0 untuk nama file yang aneh)]Saya biasanya memecahkan masalah seperti itu dari juru bahasa Python interaktif:
Mungkin lebih lama dari satu-liner dengan
find
atauxargs
, tapi itu sangat ulet, dan saya tahu persis apa yang dilakukannya, tanpa harus melakukan riset terlebih dahulu.sumber
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
jawaban yang lebih baik (dibandingkan dengan jawaban saya sebelumnya) untuk pertanyaan ini adalah dengan menggunakan
file
perintah yang kuat .sekarang masalahmu:
tugas dari
for
perintah adalah memberikan file dalam direktori saat ini dalam bentuk variabel$var
.if-then
perintah menampilkan nama-nama file pdf dengan mengambil status keluar0
darifile -i "$var" | grep -q 'application/pdf\;'
perintah, itu akan memberikan status keluar0
hanya jika menemukan file pdf.sumber
Peringatan! Lebih baik coba dulu
sumber
-i
dengangrep
untuk pencocokan case-sensitive.Baca sebagai, hapus semua file yang bukan
a.pdf
ataux.pdf
.Ini bekerja dengan memanfaatkan 2 gumpalan diperpanjang, bagian luar
!()
untuk meniadakan gumpalan terkandung yang dengan sendirinya mengharuskan gumpalan harus cocok dengan satu atau lebih daria
ataux
pola sebelum.pdf
sufiks. Lihat glob # extglob .sumber
cara shell portabel
Cukup banyak POSIX dan kompatibel dengan Bourne-gaya shell (
ksh
,bash
,dash
). Sangat cocok untuk skrip portabel dan ketika Anda tidak dapat menggunakanbash
globbing shell diperpanjang.perl:
Atau sedikit lebih bersih:
python alternatif
sumber
Berhati-hatilah dengan apa yang Anda hapus!
Cara aman untuk mengujinya sebelum mencoba menghapus adalah mengujinya terlebih dahulu
ls
, karena beberapa perilaku yang tidak tertangkap dapat menghapus file yang tidak diinginkan. Dan Anda dapat melakukannya langsung di luar direktori.ls
mirip denganrm
, jadi:Ini akan mencantumkan
Dan sekarang Anda dapat melihat apa yang Anda hapus dan dapat menghapusnya dengan aman:
Dan itu saja. Anda dapat menggunakan wildcard
*
untuk menjadi lebih selektif seperti hanya menyimpan dokumen kursus pemrograman:sumber