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

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

Anda bahkan tidak perlu menggunakan rm dalam hal ini jika Anda takut. Gunakan find:

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

Tapi gunakan dengan hati-hati. Jalankan dulu:

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

untuk melihat dengan tepat file mana yang akan Anda hapus.

Juga, pastikan bahwa -delete adalah argumen terakhir dalam perintah Anda. Jika Anda meletakkannya sebelum -name *.bak argument, ini akan menghapus semuanya.

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

< kode>temukan . - nama"*.bak " - tipe F-print0 / xargs -0 / bin / rm-f
< / kode > < / pra>

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

rm **/*.bak

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

Menghapus file bagi saya bukan sesuatu yang harus Anda gunakan rm untuk. Berikut adalah alternatif:

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

Seperti yang dinyatakan Flimm di komentar:

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

Jadi:

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.

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

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

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 bukan folder. Untuk menghapus .bak folder juga, menghapus bagian itu, dan menggunakan -execdir, yang menghindari cannot trash non-existent kesalahan untuk .bak file di dalam .bak direktori:

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

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 "."dihitung sebagai folder pertama.

Jawaban Cepat:

  • Hapus semua file dengan nama yang dipertimbangkan atau postfix secara rekursif:

    find . -name '*.pyc' -type f -delete

  • Hapus semua direktori dengan nama yang dipertimbangkan secara rekursif:

    find ~ -path '*/__pycache__/*' -delete‍‍‍find ~ -type d -name '__pycache__' -empty -delete‍‍‍

    Agak kurang dikontrol ketat, tetapi dalam satu baris:

    find ~ -path '*/__pycache__*' -delete

[Catatan]:

d adalah opsi direktori dan f adalah opsi file.

Anda bisa daftar semua file dengan ekstensi yang pertama sebelum Anda menggunakan rmMisalnya,

ls *.bak

Jika Anda mendapatkan hanya file yang ingin Anda hapus maka Anda dapat menggunakan rm

rm *.bak

Jika Anda ingin memeriksa daftar sebelum Anda menghapus file, Anda dapat menggemakannya.

find . -name "*.bak" -type f | xargs echo rm -rf

Ini akan mencantumkan hasil pencarian yang disalurkan ke perintah rm melalui xargs.Setelah Anda yakin tentang daftar Anda bisa drop echo di atas perintah.

find . -name "*.bak" -type f | xargs rm -rf

Related post- [bagaimana cara menghapus direktori secara rekursif dengan wildcard?] (rm - How do I recursively delete directories with wildcard? - Unix & Linux Stack Exchange)