opsi alternatif ke rm -f

10

Saya ingin menjalankan baris perintah:

cd ~/www/tmp/; rm -P 2*

Tapi saya mendapatkan kesalahan jika tidak ada file yang dimulai dengan 2.

Anda akan berpikir saya ingin menggunakan -f, namun:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

Dan saya melakukan perawatan tentang file permissions- jika ada sesuatu yang aneh terjadi, saya lebih memilih perintah batalkan. Saya hanya ingin menekan kesalahan 'tidak ada'.

Saya telah melihat beberapa pertanyaan lain dengan 'rm error', dan menemukan dua pertanyaan yang tampaknya (agak) relevan:

Hapus file dan direktori dengan namanya. tidak ada berkas atau direktori seperti itu

Tapi, saya tidak mengerti semua yang terjadi dalam jawaban untuk pertanyaan ini, dan tidak tahu bahwa saya membutuhkannya?

The touchhack disarankan dalam pertanyaan ini:

Sudahkah saya tidak melaporkan ketika file hilang?

Tampaknya bisa diterapkan, karena saya rasa saya tidak keberatan dengan kinerja yang memukul (tetapi jenis kinerja apa yang akan Anda ambil? - yaitu: apakah ini teknik yang cukup scalable, atau apakah saya hanya mempelajari kebiasaan yang sangat buruk?)

Saya tidak yakin bagaimana saya akan melakukan if-thendalam baris perintah.

Apakah ada opsi lain untuk pembersihan command-line sederhana cut-n-paste?

Akan find -deletebekerja lebih baik untuk kasus saya? Jika demikian, mengapa?


kesalahan dalam pertanyaan:

rm: 2*: No such file or directory
pengguna3082
sumber
1
Kesalahan berasal dari shell Anda, bukan rm, jadi Anda harus mengatakan apa itu.
Michael Homer
Apakah Anda menggunakan zshsebagai shell interaktif Anda? Apakah Anda mendapatkan No matches foundkesalahan?
Kusalananda
2
@MichaelHomer Tidak, kesalahan berasal dari rm. Shell hanya meneruskan string 2*ke rm alih-alih memperluasnya ke daftar file. Lihatlah kesalahan yang dimaksud: dikatakan bahwa rm mengeluh, bukan sh / bas / zsh / ...
doneal24

Jawaban:

13

Untuk hanya memanggil rm -Puntuk yang ada file biasa yang namanya cocok dengan pola dalam sebuah direktori (tapi tidak di bawah):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Misalnya,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Untuk mencocokkan hanya non-direktori, gunakan ! -type ddi tempat -type f. Perbedaannya adalah itu ! -type dakan berlaku untuk berbagai jenis file (tautan simbolik, pipa bernama, soket, dll.)

Karena Anda ingin diminta untuk beberapa kondisi di file yang ditemukan, Anda harus tidak menggunakan -deletebukan -exec rmkarena yang bekerja sebagai rm -f.

Hapus -maxdepth 1untuk membiarkan findmelihat dalam subdirektori secara rekursif.

Kusalananda
sumber
3
Meskipun ! -type dmungkin lebih dekat rm 2*, kurasa?
muru
Jadi, saya harus menambahkan -P untuk mendapatkan fungsionalitas itu ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Ya, saya lupa bahwa Anda juga ingin menggunakannya -P.
Kusalananda
Terima kasih @muru, saya sebenarnya ingin -type f, tetapi tidak tahu bagaimana rmbertindak seperti itu - jadi saran @ Kusalanada sangat tepat, dan diferensiasi / penjelasannya bagus untuk belajar.
user3082
@ user3082 Anda mungkin harus menggunakan globbing diperpanjang shell Anda (misalnya, rm 2*(.)dalam zsh).
muru