Pertanyaan Bagaimana saya bisa secara rekursif menghapus semua file dari ekstensi tertentu di direktori saat ini?


Bagaimana cara menghapus semua file dengan ekstensi tertentu secara aman (mis. .bak) dari direktori saat ini dan semua subfolder menggunakan satu baris perintah? Cukup, saya takut untuk menggunakannya rm karena saya salah menggunakannya sekali dan sekarang saya butuh saran.


421
2017-11-15 13:03


asal




Jawaban:


Anda bahkan tidak perlu menggunakannya rm dalam hal ini jika Anda takut. Menggunakan find:

find . -name "*.bak" -type f -delete

Tetapi gunakan dengan hati-hati. Jalankan lebih dulu:

find . -name "*.bak" -type f

untuk melihat file mana yang akan Anda hapus.

Juga, pastikan bahwa -delete adalah argumen terakhir dalam komando Anda. Jika Anda menaruhnya sebelum -name *.bak argument, itu akan menghapus segalanya.

Lihat man find dan man rm untuk info lebih lanjut dan lihat juga pertanyaan terkait ini di SE:


660
2017-11-15 13:08



Bagaimana ini berbeda dari rm *.bak? - sayantankhan
@ Bolt64 Anda rm *.bak tidak akan berfungsi untuk subdirektori. - Radu Rădeanu
Dengan pengaturan default rm *.bak hanya akan menghapus semua file yang diakhiri dengan .bak di direktori saat ini. UNTUK juga melakukan hal-hal di subdirektori yang Anda perlukan untuk bermain-main dengan globs, gunakan opsi -r atau gunakan contoh find. - Hennes
@Hennes Hati-hati dengan rm -r *.bak! Ini juga menghapus direktori yang diakhiri dengan .bak dengan semua konten mereka. - Radu Rădeanu
Yakinkan bahwa -delete adalah argumen terakhir dalam perintah Anda. Jika Anda menaruhnya sebelum -name *.bak argumen, itu akan menghapus segalanya. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Selamat datang di askubuntu! Meskipun ini adalah jawaban yang sangat valid, saya rasa tidak ada untungnya dalam menggunakan ini, bukan -delete bendera find. Informasi lebih lanjut dapat ditemukan di Masukan manual GNU untuk menghapus file dengan find. - Glutanimate
Anda mungkin benar, itu hanya solusi alternatif, mungkin lebih baku;) - lokers
Ini bukan hanya alternatif tetapi contoh bagaimana perintah lain dapat dikombinasikan bersama dengan pipa '|'. +1 - Boris Pavlović
Solusi alternatif ini bekerja pada lingkungan lain yang tidak memiliki -delete (seperti cygwin) - ciriarte
Saya pikir ini adalah jawaban terbaik di sini. - Léo Léopold Hertz 준영


Pertama jalankan perintahnya shopt -s globstar. Anda dapat menjalankannya di baris perintah, dan itu hanya akan berpengaruh di jendela shell itu. Anda bisa menaruhnya di Anda .bashrc, dan kemudian semua shell yang baru mulai akan mengambilnya. Efek dari perintah itu adalah untuk membuatnya **/ mencocokkan file dalam direktori saat ini dan subdirektorinya secara rekursif (secara default, **/ berarti hal yang sama */: hanya di subdirektori langsung). Kemudian:

rm **/*.bak

(atau gvfs-trash **/*.bak atau apa yang Anda miliki).


28
2017-11-15 18:59





Menghapus file adalah untuk saya bukan sesuatu yang harus Anda gunakan rm untuk. Berikut ini alternatifnya:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Seperti dinyatakan Flimm dalam komentar:

Paket trash-cli melakukan hal yang sama gvfs-trash tanpa ketergantungan pada gvfs.

Begitu:

sudo apt-get install trash-cli

Anda tidak perlu membuat alias untuk ini, karena trash-cli paket menyediakan perintah trash, yang melakukan apa yang kita inginkan.

Sebagaimana yang dijelaskan oleh Eliah Kagan dalam komentar yang luas, Anda juga dapat membuat penggunaan rekursif ini find. Dalam hal ini Anda tidak dapat menggunakan alias, jadi perintah di bawah ini menganggap Anda telah menginstal trash-cli. Saya merangkum komentar-komentar Eliah:

Perintah ini menemukan dan menampilkan semua .bak file dan symlink di mana saja di direktori saat ini atau subdirektorinya atau di bawah.

find . -name '*.bak' -xtype f

Untuk menghapusnya, tambahkan -exec dengan trash perintah:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f memilih file dan symlink ke file, tetapi tidak folder. Untuk menghapus folder .bak juga, hapus bagian itu, dan gunakan -execdir, yang menghindari cannot trash non-existent kesalahan untuk .bak file di dalam .bak direktori:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Jangan gunakan rm untuk menghapus hal-hal "adalah pernyataan yang kontroversial tetapi saya harus setuju bahwa lebih bijak untuk menggunakan sesuatu yang akan membuat Anda membatalkan sesuatu. - Oli♦
Paket trash-cli melakukan hal yang sama gvfs-trash tanpa ketergantungan gvfs. - Flimm
Saya telah mengeditnya dalam jawaban, lain kali silakan mengedit sendiri. - don.joey
@ don.joey Jawaban ini sepertinya mengatakan find . -name "*.bak" -type f menampilkan apa trash *.bak menghapus. Apakah itu yang kamu maksud? Anda dapat memindahkan direktori ke tempat sampah trash atau gvfs-trash, tapi trash *.bak hanya akan memindahkan file dan direktori yang namanya diakhiri .bak dan yang langsung berada di direktori saat ini. Cangkangnya mengembang *.bak, jadi trash *.bak tidak akan mempengaruhi .bak file dalam subdirektori yang tidak disebutkan namanya .bak. - Eliah Kagan
@ don.joey Ya ls *.bak (yang menurut saya maksud Anda) mendaftar apa trash *.bak sampah. find . -name '*.bak' -xtype f -exec trash {} + sampah semua .bak file di mana saja di bawah .. Tidak dapat menggunakan alias, jadi instal trash-cli atau menulis gvfs-trash sebagai gantinya. Inilah contohnya.  -xtype f memilih file dan symlink ke file, tetapi tidak folder. Untuk menghapus .bak  folder juga, gunakan find . -name '*.bak' -execdir trash {} +, yang menghindari cannot trash non existent kesalahan untuk .bak file di dalam .bak direktori. Jangan ragu untuk menggunakan semua ini dalam jawaban Anda. - Eliah Kagan


Jika Anda ingin menghapus semua file dari jenis tertentu, tetapi hanya 1 folder "dalam" dari folder saat ini:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 karena direktori saat ini "."dianggap sebagai folder pertama.


3
2017-11-26 17:21





Jika Anda berada di dalam git repo, Anda dapat menggunakan:

git clean -fdx

Ini menghapus file dan file yang tidak terlacak di .gitignore.


0
2017-08-09 07:38