Bagaimana saya bisa menghapus semua file dengan ekstensi tertentu di folder tertentu?

36

Jika saya mengatur direktori saat ini / bekerja (menavigasi menggunakan itu cd) ke beberapa direktori tertentu dan kemudian ketik:

rm *.xvg

Apa yang akan dilakukan perintah ini? Benarkah perintah di atas hanya akan menghapus file dengan ekstensi .xvg hanya di direktori kerja?

Saya merasa gugup untuk mencoba ini sebelum bertanya, karena saya ingin benar-benar yakin bahwa perintah di atas hanya akan menghapus .xvgfile yang TERLETAK DI DIREKTORI KERJA .

Andrew
sumber

Jawaban:

34

Ya, hanyarm *.xvg akan menghapus file dengan ekstensi yang ditentukan di direktori Anda saat ini .

Cara yang baik untuk memastikan Anda memang ada di direktori yang Anda ingin hapus file Anda adalah dengan menggunakan pwdperintah yang akan menampilkan direktori Anda saat ini dan kemudian lakukan lsuntuk memverifikasi Anda menemukan file yang Anda harapkan.

Jika Anda sedikit khawatir tentang mengeluarkan rmperintah, ada 2 hal yang dapat Anda lakukan:

  1. ketik ls *.xvguntuk melihat daftar file apa yang akan dipengaruhi oleh perintah ini.

  2. Kecuali Anda memiliki banyak file, Anda selalu dapat menggunakan -isaklar baris perintah untuk rm(juga ada untuk cpdan mv). Menggunakan rm -i *.xvgakan meminta Anda untuk setiap file individual jika tidak masalah untuk menghapusnya, sehingga Anda dapat yakin tidak ada yang tidak Anda harapkan akan dihapus. (Ini akan membosankan jika Anda memiliki banyak file :)

Levon
sumber
1
Juga: rm -f {*.xvg,.*.xvg}untuk menghapus juga file yang tersembunyi. Dan rm -R -f {*.xvg,.*.xvg}untuk menghapus juga direktori.
Dor
20

Anda tidak perlu menavigasi ke dir, cukup gunakan

rm /some/dir/*.xvg 

Jika Anda memiliki kesalahan ketik atau kesalahan serupa di path, di mana / som / dir tidak ada:

cd /som/dir
rm *.xvg

secara tidak sengaja akan menghapus semua file .xvg di direktori saat ini. Perintah pertama tidak akan, dan Anda tidak perlu melakukan cd kembali.

Cara alternatif adalah menggunakan find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
Pengguna tidak diketahui
sumber
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete berhasil untuk saya! gunakan -maxdepth "n" untuk menghapus file yang cocok di sub direktori jika diberikan path
Vinay
3

Ya, rm *.xvghanya akan menghapus file yang diakhiri dengan .xvgdirektori Anda saat ini. Inilah sebabnya.

Saat Anda mengetik perintah seperti ini, pekerjaan dibagi antara shell yang Anda gunakan (mari kita asumsikan bash) dan biner perintah.

Anda dapat menemukan biner dengan mengetik which rm. Program kecil ini menangani penghapusan tautan file. Program seperti ini dapat dimulai dari baris perintah dan dapat membaca daftar argumen prog arg1 arg2 arg3saat dijalankan. Dalam kasus rm, mereka ditafsirkan sebagai daftar nama file yang memenuhi syarat untuk dihapus. Jadi, jika Anda berada di direktori yang berisi file foo.bar, mengetik delete 'foo.*'akan menghasilkan rm: foo.*: No such file or directory. Perhatikan tanda kutip tunggal di sekitar pola file, mereka memberi tahu shell untuk meneruskan argumen ke shell sebagaimana adanya.

Namun jika Anda mengetik rm *.bardi direktori yang sama, itu akan menghapus file. Apa yang terjadi di sini adalah shell Anda, yang merupakan program yang Anda gunakan untuk mengetikkan perintah, melakukan beberapa transformasi sebelum meneruskan argumen ke perintah. Salah satunya disebut 'ekspansi nama file', atau dikenal sebagai 'globbing'. Anda dapat melihat daftar perluasan nama file bash di sini . Salah satu ekspansi yang paling umum adalah *, yang diperluas ke nama file di direktori saat ini.

Cara sederhana untuk melihat gumpalan di tempat kerja adalah menggunakan echo, yang mencetak kembali semua argumen yang diteruskan melalui cangkang. Jadi mengetik echo *di direktori yang sama akan ditampilkan foo.bar. Jadi ketika Anda mengetik rm *.bar, apa yang sebenarnya terjadi adalah shell memperluas daftar argumen foo.bar, lalu meneruskannya ke rmperintah.

Ada beberapa cara mengendalikan globbing. Dalam versi bash terbaru, misalnya, Anda dapat mengaktifkan opsi yang disebut globstar yang akan melakukan ekspansi rekursif. Mengetik echo **/*.barakan menampilkan daftar semua file yang diakhiri .bardengan semua subfolder. Jadi, mengetikkan rm **/*.barbash yang diaktifkan globstar memang akan menghapus semua file yang cocok secara rekursif dalam subfolder.

purzelrakete
sumber
1

Perintah:

  rm ./*.pgm

bekerja untukku

Perintah:

rm *.pgm

memberikan perintah kesalahan (dalam bahasa Polandia, diterjemahkan):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

di

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Adam
sumber