Saya ingin membuka semua file teks yang merupakan hasil dari perintah ls menggunakan editor teks. Bagaimana saya melakukan ini?
sumber
Saya ingin membuka semua file teks yang merupakan hasil dari perintah ls menggunakan editor teks. Bagaimana saya melakukan ini?
Gilles benar , ls
adalah contoh yang sangat buruk karena ekspansi nama file glob dapat dilakukan jauh lebih mudah di baris perintah tanpa harus menggunakan ls
sama 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 file
akan 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 xargs
atau for
loop dalam jawaban jmtd tergantung pada apakah Anda menggunakan editor berbasis terminal yang membutuhkan stdio.
editor-command *.css
, dll.Untuk membuka semua file yang disebut sesuatu
.txt
(yaitu*.txt
) di direktori saat ini:di mana
$EDITOR
adalah editor favorit Anda, misalnyagedit *.txt
,nano *.txt
,vim *.txt
,emacs *.txt
atau apa pun. Gunakan hanya*
untuk mencocokkan semua file di direktori saat ini.Perhatikan bahwa
ls
perintah tidak terlibat. Pekerjaanls
tidak benar-benar menampilkan daftar file, meskipun itu terjadi ketika Anda memintanya pada direktori. Yangls
berguna 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
.sumber
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
find
ke yang sesuaixargs
. Ini juga tergantung pada $ EDITOR yang tidak mengambil alih TTY (jadi, menggunakan yang grafis)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):
sumber
$EDITOR *.c
ataufor i in *.c; do $EDITOR "$i"; done
.for
case ini akan gagal untuk banyak nama file, termasuk collapsing / mengubah karakter spasi putih.for
kasing akan bekerja dengan setiap nama file (kecuali kemungkinan nama yang dimulai dengan-
atau+
dengan beberapa editor;for i in ./*.c
akan memperbaikinya).