Bagaimana cara membuka semua file yang merupakan hasil dari perintah ls?

10

Saya ingin membuka semua file teks yang merupakan hasil dari perintah ls menggunakan editor teks. Bagaimana saya melakukan ini?

c0smikdebris
sumber

Jawaban:

12

Gilles benar , lsadalah contoh yang sangat buruk karena ekspansi nama file glob dapat dilakukan jauh lebih mudah di baris perintah tanpa harus menggunakan lssama sekali! Jika "file teks" yang Anda sebut memiliki ekstensi nama file untuk mengidentifikasi mereka, Anda dapat melakukan sesuatu seperti ini:

editor-command *.txt

Demi menunjukkan teknik, mari gunakan contoh yang lebih rumit yang tidak bisa dilakukan hanya dengan nama file yang cocok dan buka file berdasarkan konten alih-alih hanya nama file. Katakanlah Anda ingin membuka semua file yang berisi string "tipe konten".

Dengan asumsi editor Anda akan menerima beberapa nama file dan membukanya sekaligus dalam buffer yang terpisah atau secara berurutan mengerjakannya, Anda cukup menjalankan:

editor-command $(grep -i content-type)

Sekarang kembali ke pertanyaan awal Anda, katakanlah Anda tidak tahu apakah itu file teks atau tidak berdasarkan nama mereka. Anda kemudian perlu menggunakan program lain untuk mengidentifikasi mereka, lalu membukanya berdasarkan data itu. Program fileakan memberi tahu Anda apa jenis file itu, dan Anda dapat memahami daftar itu hanya untuk file teks, dan kemudian buka hanya nama file yang cocok seperti ini:

editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)

Output dari rantai perintah di dalam $()konstruk akan digunakan sebagai argumen untuk editor. Saya terkadang melakukan ini dalam dua tahap. Katakanlah saya sedang mencari beberapa set file dan dapatkan sendiri daftar setiap file xml yang berisi string "tipe konten"

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

... dan putuskan saya ingin membukanya. Saya kemudian menggunakan pintasan riwayat perintah terakhir dan melakukan ini:

vim $(!!)

... untuk membuka semua hasil dari perintah sebelumnya di vim, editor favorit saya.

Jika editor Anda hanya akan menerima satu file pada satu waktu dan Anda harus tetap membuat editor, Anda perlu menggunakan varian dari salah satu xargsatau forloop dalam jawaban jmtd tergantung pada apakah Anda menggunakan editor berbasis terminal yang membutuhkan stdio.

Caleb
sumber
4
Jangan parsing output ls! Gunakan editor-command *.css, dll.
Gilles 'SO- stop being evil'
@Gilles: Tercatat, terima kasih untuk menunjukkan yang jelas bahwa kita semua tidak bisa melihat. @ c0smikdebris Perhatikan bahwa saya hanya menulis ulang jawaban saya sepenuhnya termasuk case karena jika Anda tidak memiliki cara yang jelas untuk mencocokkan file mana yang teks dengan hanya dengan nama mereka.
Caleb
$ () adalah apa yang sebenarnya saya cari. saya seharusnya menyebutkan bahwa saya menggunakan ls sebagai contoh di sini. +1 untuk kedua jawaban.
c0smikdebris
"editor favorit saya". Tidak perlu menentukan, @ Caleb, karena jelas lebih atau kurang dari awal jawaban, ahahah! Editor terbaik!
Enrico Maria De Angelis
4

Untuk membuka semua file yang disebut sesuatu .txt(yaitu *.txt) di direktori saat ini:

$EDITOR *.txt

di mana $EDITORadalah editor favorit Anda, misalnya gedit *.txt, nano *.txt, vim *.txt, emacs *.txtatau apa pun. Gunakan hanya *untuk mencocokkan semua file di direktori saat ini.

Perhatikan bahwa lsperintah tidak terlibat. Pekerjaan lstidak benar-benar menampilkan daftar file, meskipun itu terjadi ketika Anda memintanya pada direktori. Yang lsberguna adalah dalam menampilkan atribut file (waktu modifikasi, izin, ukuran dan sebagainya). Untuk hanya melakukan sesuatu pada sekelompok file yang cocok dengan pola wildcard tertentu, gumpalan shell sudah cukup.

Editor yang cukup canggih memungkinkan Anda melakukan ini dari dalam. Misalnya, di Emacs, cukup gunakan perintah pembukaan file normal ( C-x C-f) dan masukkan *.txt.

Jika Anda juga ingin mencocokkan file dalam subdirektori, dalam zsh atau bash ≥4, Anda dapat menggunakan $EDITOR **/*.txt.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Itu benar-benar spesifik editor. Tidak ada jaminan semua editor akan memperlakukan semua argumen baris perintah gratis mereka sebagai file untuk dibuka, atau mendukung pembukaan lebih dari satu file sekaligus.
jmtd
2

Itu tergantung pada beberapa nuansa editor teks Anda. Editor tingkat lanjut mungkin dapat menangani membuka banyak file dari baris perintah dalam satu contoh. Tetapi katakan, misalnya, bahwa editor Anda ($ EDITOR dalam contoh saya di bawah) hanya dapat membuka satu per satu. Anda harus menyalurkan output findke yang sesuai xargs. Ini juga tergantung pada $ EDITOR yang tidak mengambil alih TTY (jadi, menggunakan yang grafis)

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

Jika Anda ingin menggunakan editor konsol, shell loop mungkin lebih sesuai, tetapi jika gagal untuk banyak nama file yang tidak umum (dengan menciutkan atau mengganti karakter spasi putih dan berbagai hal lainnya):

for i in *.c; do $EDITOR "$i"; done
jmtd
sumber
2
Jangan parsing output ls! Gunakan $EDITOR *.catau for i in *.c; do $EDITOR "$i"; done.
Gilles 'SANGAT berhenti menjadi jahat'
Tangkapan yang bagus - diedit dengan tepat.
jmtd
Perhatikan bahwa forcase ini akan gagal untuk banyak nama file, termasuk collapsing / mengubah karakter spasi putih.
jmtd
Seperti yang ditulis sekarang, forkasing akan bekerja dengan setiap nama file (kecuali kemungkinan nama yang dimulai dengan -atau +dengan beberapa editor; for i in ./*.cakan memperbaikinya).
Gilles 'SANGAT berhenti menjadi jahat'