Apakah 'rm file *' menghapus semua kecocokan dari semua sub-direktori?

13

Saya ingin menghapus file apa pun yang terlihat wordpress-891.sqldari direktori saat ini (bukan di dalam sub-direktori).

Akan rm wordpress-*.sqlmelakukan trik atau akankah ini juga menghapus kecocokan dari sub-direktori?

HorusCoding
sumber
1
Sebagai tambahan, sementara semua jawaban lain berakhir benar, ada satu twist lagi: sebenarnya bash, bukan perintah rm, yang memperluas wildcard. Jika Anda memiliki sepuluh file yang cocok di direktori Anda, rm tidak akan melihat wildcard, melainkan sepuluh argumen individual. Jika Anda ingin rm melakukan ekspansi, Anda harus melampirkan argumen Anda dalam tanda kutip tunggal. Untuk rm, itu tidak membuat perbedaan, tetapi dalam beberapa konteks lain mungkin. Biasanya, ketika wildcard merujuk pada sesuatu selain file, seperti paket apt-get.
Kevin Keane
3
@KevinKeane, rmtidak melakukan ekspansi nama file ... rm "foo*"akan mencoba menghapus file dengan tanda bintang literal dalam namanya.
ilkkachu

Jawaban:

20

Tidak. Globing normal *tidak rekursif dan tidak juga rm.

Jika nama direktori cocok, itu tidak akan dihapus - Anda perlu -rbendera untuk menghapus direktori.

Jadi aman untuk melakukannya jika Anda yakin ingin menghapus file-file itu.

Anda juga dapat membuat rminteraktif

rm -i wordpress-*.sql

maka akan meminta konfirmasi sebelum menghapus setiap file

Zanna
sumber
14

Ya itu berhasil untuk Anda dan menghapus semua file dengan skema itu di direktori saat ini. Dan TIDAK, itu tidak menghapus file dalam sub-direktori.

Kapanpun Anda tidak yakin apa yang terjadi ketika Anda menjalankan perintah seperti:

rm wordpress-*.sql

maka jalankan saja menggunakan ls:

ls wordpress-*.sql

file yang Anda lihat di output adalah yang akan dihapus.

Ketika Anda mencoba untuk mendapatkan daftar seperti foo*:, lebih baik menggunakan -dsakelar lsuntuk mencegah daftar berkas dengan direktori bernama foobar/dll.

ls -d foo*

Trik ini berfungsi untuk perintah yang tidak digunakan untuk melakukan pekerjaan secara rekursif.

Hal lain yang dapat Anda lakukan adalah mengetikkan input yang Anda inginkan, misalnya: wordpress-*lalu tekan Ctrl+ Alt+ *, dan sekarang semua kecocokan diketik secara otomatis di depan perintah Anda.

Ravexina
sumber
4
Metode favorit saya:printf "%s\n" wordpress-*.sql
wjandrea
1
Anda juga bisa berpura-pura menyukai Echo echo rm file*. Terutama mencari nama file yang bermusuhan seperti-rf
eckes
@eckes: Anda dapat menutupi mereka lebih aman dengan baik rm ./*atau rm -- *.
David Foerster
Ya, atau gunakan xargs -0@DavidFoerster
eckes
jika Anda pergi ls foo*dan Anda memiliki direktori yang dipanggil foobar, Anda juga mendapatkan daftar isi direktori itu, jadi polos lsbukan cara terbaik untuk apa yang rmakan terjadi
ilkkachu
12

Tidak, rmtidak berulang melalui subdirektori.

Lihat Menghapus file yang cocok di semua subdirektori - SuperUser untuk metode menghapus file dalam subdirektori.

Jika Anda pernah khawatir tentang menghapus sesuatu yang penting secara tidak sengaja, gunakan gvfs-trash(yang mengirim file ke tempat sampah) alih-alih rm(yang secara permanen menghapus file).

wjandrea
sumber
Terima kasih untuk gvfs-trashmenyebutkan belajar sesuatu hari ini hampir tidak menggunakannya ...
George Udosen
-1

Jika Anda ingin menemukan dan menghapus semua file yang cocok seperti wordpress-*.sql, Anda dapat menggunakan findperintah. :)

Misalnya, Anda ingin menghapus semua file yang cocok dengan di wordpress-*.sqlbawah test_dir, lakukan seperti berikut ini.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Setiap kali findprogram benar-benar menemukan file yang cocok, ia mencoba untuk menjalankan perintah berikut -execopsi setelah Dalam hal ini rm -f {}akan dieksekusi dan {}akan diubah ke nama file yang cocok. Misalnya

rm -f wordpress-169.sql

Anda juga dapat mengatur kedalaman sub-direktori dengan -maxdepthopsi.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Harap dicatat bahwa Anda harus menentukan -maxdepthopsi sebelum opsi lain. Kalau tidak, Anda dapat memenuhi hasil yang sebenarnya tidak ingin Anda lihat.

Taman Sung-Jin
sumber
1
OP menginginkan yang sebaliknya: tidak muncul kembali ke dalam subdirektori.
Melebius
2
GNU menemukan: "opsi mempengaruhi semua tes, termasuk tes yang ditentukan sebelum opsi", daftar opsi di bawah ini termasuk -maxdepth. Gunakan -exec rm -f {} +daripada -exec \;, atau lebih baik lagi, hanya-delete
ilkkachu