GNU/Linux >> Belajar Linux >  >> Linux

Linux, mengapa saya tidak dapat mem-pipe find result ke rm?

Untuk memperluas jawaban @Alex Gitelman:ya, ada perbedaan antara "input standar" dan baris perintah.

Saat Anda mengetik rm a.txt b.txt c.txt , file yang Anda cantumkan setelah rm dikenal sebagai argumen dan tersedia untuk rm melalui variabel khusus (disebut argv secara internal). Input standar, sebaliknya, terlihat pada program Unix seperti file bernama stdin . Suatu program dapat membaca data dari "file" ini seperti jika membuka file biasa di disk dan membaca dari situ.

rm , seperti banyak program lainnya, mengambil argumennya dari baris perintah tetapi mengabaikan masukan standar. Anda dapat menyalurkan apa pun yang Anda suka; itu hanya akan membuang data itu. Di situlah xargs berguna. Itu membaca baris pada input standar dan mengubahnya menjadi argumen baris perintah, sehingga Anda dapat menyalurkan data secara efektif ke baris perintah dari program lain. Itu trik yang rapi.

Misalnya:

find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm  

Perhatikan bahwa ini akan bekerja secara tidak benar jika ada nama file yang berisi baris baru atau spasi. Untuk menangani nama file yang berisi baris baru atau spasi, Anda harus menggunakan:

find . -name ".txt" -print0 | xargs -0 rm

Ini akan memberi tahu find untuk mengakhiri hasil dengan karakter null alih-alih baris baru. Namun, grep tidak akan berfungsi seperti sebelumnya. Sebagai gantinya gunakan ini:

find . -name ".txt" | grep "foo" | tr "\n" "\0" | xargs -0 rm

Kali ini tr digunakan untuk mengubah semua baris baru menjadi karakter nol.


"mengapa saya tidak dapat mengirimkan hasil pencarian ke rm?"

Saat Anda mem-pipe sesuatu ke suatu program, pipa tersebut menggantikan input keyboard. Ingatlah hal ini dan tanyakan pada diri Anda pertanyaan berikutnya:Apa yang akan rm lakukan dengan keyboard? Hapus penekanan tombol Anda ? (agak konyol memang) Menerima kontrol interaktif? (rm tidak interaktif kecuali kadang-kadang membutuhkan konfirmasi, yang memang bisa diberikan melalui pipa.)

Faktanya, ketika rm sudah berjalan, Anda tidak dapat mengetikkan perintah untuk membiarkannya menghapus file....jadi Anda juga tidak dapat melakukannya dengan pipa.

Jika Anda ingat bahwa pipa menggantikan kombinasi keyboard/layar, semuanya akan segera tampak lebih logis.

Sekarang sebaliknya. Anda dapat menyalurkan datastream ke grep .Apakah itu berarti Anda dapat membiarkan grep membaca penekanan tombol dari keyboard Anda sebagai data masukan?

YA! Itulah sebenarnya yang dilakukannya secara native (tanpa perpipaan).

(b.t.w. perhatikan bahwa Anda tidak dapat menyalurkan atau mengetikkan argumen pencarian ke grep )

Jadi sekarang Anda tahu mengapa Anda tidak bisa pipa ke rm dan mengharapkannya berfungsi sebagai argumen baris perintah.

tl;dr :

Anatomi program menurut filosofi UNIX:
masukkan, keluarkan, keyboard masuk, keluarkan layar. -> Pipa hanya mengganti keyboard dan layar.


Pipa mengirimkan output dari perintah pertama ke input standar kedua. rm tidak menerima input standar sehingga Anda tidak dapat menyalurkannya. Anda bisa menggunakan xargs untuk mencapai efek yang sama. Anda dapat menemukan contoh untuk xargs khusus untuk kasus Anda di halaman manual untuk xargs.


Linux
  1. Bagaimana saya bisa menemukan file tertentu dari terminal Linux?

  2. Cara mem-pipe hasil 'find' ke mv di Linux

  3. Bagaimana saya bisa menemukan versi shell saya menggunakan perintah Linux?

  1. Bagaimana saya bisa mengetahui apakah sistem Linux menggunakan Wayland atau X11?

  2. Bisakah saya memainkan Dota 2 di Linux?

  3. Bagaimana saya bisa menemukan jumlah pengguna online di Linux?

  1. temukan Contoh Perintah di Linux

  2. Bagaimana cara memasukkan pipa | di linux saya temukan -exec perintah?

  3. Mengapa saya tidak bisa membuat file lebih besar dari 2 GB di Linux?