Bagaimana menghindari keharusan mengeluarkan "y" beberapa kali saat menghapus file yang dilindungi

52

Saya mencari solusi untuk digunakan sebagai respons terhadap "rm: hapus file biasa yang dilindungi tulis [x]?"

Saya berpikir untuk mengeluarkan karakter diikuti dengan carriage return untuk beberapa kali, di bashrc. Bagaimana kita melakukannya?

Iancovici
sumber
Anda dapat mendefinisikan suatu fungsi. Thrad ini dapat membantu Anda: stackoverflow.com/questions/756756/… .
alpert
Mengapa Anda ingin melakukan ini? Ini adalah tugas yang sangat tidak jelas untuk ingin mencetak pengembalian carriage (sebagai lawan dari baris baru) dalam hal apa pun, dan dalam .bashrc?
l0b0
@ l0b0 pertanyaan yang diedit menjadi lebih spesifik
Iancovici
Mengapa Anda ingin menghapus file di .bashrc? Tugas asli masih belum jelas.
l0b0
3
@echadromani Sangat umum pada SO / SE untuk mencoba memahami masalah asli untuk memberikan solusi optimal yang dapat diterapkan pada situasi lain.
l0b0

Jawaban:

75

Edit berdasarkan pertanyaan yang diperbarui:

Untuk menghindari ditanya tentang menghapus file, tambahkan opsi -f("paksa"):

rm -f /path/to/file

Ini memiliki satu efek samping yang harus Anda perhatikan: Jika salah satu jalur yang diberikan tidak ada, itu tidak akan melaporkan ini, dan itu akan kembali dengan sukses:

$ rm -f /nonexistent/path
$ echo $?
0

Jawaban asli:

Inilah satu solusi sederhana:

yes "$string" | head -n $number | tr $'\n' $'\r'

yesmengulangi setiap string yang Anda berikan tanpa batas, dipisahkan oleh baris baru. headmenghentikannya setelah beberapa $numberkali, dan trmenerjemahkan baris baru ke carriage return. Anda mungkin tidak melihat output apa pun karena carriage return, tetapi meneruskannya ke perintah ini (di bash) harus menggambarkannya:

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

Pengguna tanpa bashdapat menyalurkan hasilnya ke od, hexdumpatau xxduntuk melihat karakter yang sebenarnya dikembalikan.

l0b0
sumber
7

Masalah lain yang sering saya rmtemui adalah, alias rm -i, seperti ini di / etc / bashrc:

alias rm='rm -i'

Dalam hal ini Anda bisa unalias rmatau Anda dapat menggunakan trik ini yang saya temukan bertahun-tahun yang lalu, letakkan backslash di depan perintah yang telah alias, untuk mengabaikan alias hanya sekali itu saja, misalnya:

\rm somefile

Anda dapat mempelajari lebih lanjut tentang alias melalui sebuah artikel di Nixcraft .

slm
sumber
5

rmhardcoded untuk bertanya "secara interaktif" (prompt menunggu input pengguna) pada file yang dilindungi tulis. ada dua metode untuk mencegah rmbertanya:

rm -rf somedir

dan

rm -r --interactive=never somedir

(keduanya juga berfungsi tanpa -rsaat menghapus file, bukan dirs)

penjelasan:

-fmembuat rmuntuk "mengabaikan file dan argumen yang tidak ada, tidak pernah meminta".

--interactive=nevermelakukan apa yang dikatakannya: tidak pernah interaktif. dengan kata lain: tidak pernah cepat.

perbedaan antara -fdan --interactive=nevermerupakan bagian ini: "abaikan file dan argumen yang tidak ada".

membandingkan:

$ rm -rf nonexistingname
$ echo $?
0

dan

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

perbedaannya terutama menarik ketika menulis skrip di mana Anda tidak pernah ingin rminteraktif tetapi masih ingin menangani kesalahan.

ringkasan: pada penggunaan baris perintah rm -rf. dalam penggunaan skrip rm -r --interactive=never.


untuk menjawab pertanyaan yang dinyatakan ("Bagaimana cara menghindari kebutuhan untuk mengeluarkan" y "beberapa kali saat menghapus file yang dilindungi") lihat https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line / 338860 # 338860

lesmana
sumber
1

berikan saja ya untuk semua perintah Anda!

yes | rm -r /path/
yes | <command>

Bagaimanapun Anda selalu dapat memaksa menggunakan -f:

rm -r -f /path
Nakamoto
sumber
-2

Saya juga mengalami masalah yang sama. Jawaban di atas hanya untuk satu file tetapi jika Anda ingin mengabaikan banyak ya.

Anda dapat gunakan

sudo rm -r /path/to/directory

untuk menghapus semua file biasa yang dilindungi tulis

Gopal Prasad
sumber
Ini sedang downvoted karena menghapus seluruh direktori. Agaknya OP hanya ingin menghapus file yang dimaksud, tidak setiap file dalam subtree direktori yang sama.
Jake
Hei .... Mungkin kamu benar.
Gopal Prasad
Hei .... Mungkin kamu benar. Tapi tidak dalam kasus ini .. Seolah-olah pengguna memiliki banyak kesabaran dan waktu, maka dia juga punya waktu untuk memberikan 'ya' beberapa kali ... Saya berasumsi bahwa dia ingin menghapus semua file dengan satu perintah .. Seperti menulis file yang dilindungi selalu meminta konfirmasi sebelum menghapus jenis file ini .. Salah satu contohnya adalah ketika Anda membuat virtualenv dan kemudian Anda ingin menghapus dengan python .. Silakan coba dan Anda akan menemukan perintah rm meminta konfirmasi dan setiap kali Anda harus memberikan jawaban .. Saya telah menyelesaikan situasi dengan cara ini.
Gopal Prasad