Tôi muốn mở tất cả các tệp văn bản là kết quả của lệnh ls bằng trình soạn thảo văn bản. Làm thế nào để tôi làm điều này?
Tôi muốn mở tất cả các tệp văn bản là kết quả của lệnh ls bằng trình soạn thảo văn bản. Làm thế nào để tôi làm điều này?
Câu trả lời:
Gilles hoàn toàn chính xác , ls
là một ví dụ thực sự tồi tệ vì việc mở rộng tên tệp toàn cầu có thể được thực hiện dễ dàng hơn nhiều trên dòng lệnh mà không phải sử dụng ls
gì cả! Nếu cái gọi là "tệp văn bản" của bạn có phần mở rộng tên tệp để xác định chúng, bạn có thể làm một cái gì đó như thế này:
editor-command *.txt
Để thể hiện một kỹ thuật, hãy sử dụng một ví dụ phức tạp hơn không thể thực hiện được chỉ bằng một tên tệp trùng khớp và mở các tệp dựa trên nội dung thay vì chỉ tên tệp. Hãy nói rằng bạn muốn mở tất cả các tệp có chứa chuỗi "kiểu nội dung".
Giả sử trình soạn thảo của bạn sẽ chấp nhận nhiều tên tệp và mở tất cả chúng cùng một lúc trong các bộ đệm riêng biệt hoặc hoạt động liên tục theo cách của chúng, bạn chỉ cần chạy:
editor-command $(grep -i content-type)
Bây giờ trở lại câu hỏi ban đầu của bạn, giả sử bạn không biết liệu chúng có phải là tệp văn bản hay không dựa trên tên của chúng. Sau đó, bạn sẽ cần sử dụng một chương trình khác để xác định chúng, sau đó mở chúng dựa trên dữ liệu đó. Chương trình file
sẽ cho bạn biết loại tệp nào đó là gì và bạn có thể grep danh sách đó chỉ cho các tệp văn bản, sau đó mở chỉ các tên tệp phù hợp như thế này:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
Đầu ra của chuỗi lệnh bên trong $()
cấu trúc sẽ được sử dụng làm đối số cho trình soạn thảo. Đôi khi tôi làm điều này trong hai giai đoạn. Giả sử tôi đang xem qua một số bộ tệp và nhận cho mình một danh sách mọi tệp xml chứa chuỗi "kiểu nội dung"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... Và quyết định tôi muốn mở chúng. Sau đó tôi sử dụng phím tắt lịch sử lệnh cuối cùng và làm điều này:
vim $(!!)
... Để mở tất cả các kết quả của lệnh trước đó trong vim, trình soạn thảo yêu thích của tôi.
Nếu trình soạn thảo của bạn sẽ chỉ chấp nhận một tệp cùng một lúc và bạn cần tiếp tục sinh ra các trình soạn thảo, bạn sẽ cần sử dụng một biến thể của câu trả lờixargs
hoặc for
vòng lặp trong câu trả lời của jmtd tùy thuộc vào việc bạn có đang sử dụng trình soạn thảo dựa trên thiết bị đầu cuối cần stdio hay không.
Để mở tất cả các tệp được gọi là cái gì đó .txt
(tức là *.txt
) trong thư mục hiện tại:
$EDITOR *.txt
nơi $EDITOR
là biên tập viên yêu thích của bạn, ví dụ như gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
hoặc bất cứ điều gì. Sử dụng chỉ *
để phù hợp với tất cả các tập tin trong thư mục hiện tại.
Lưu ý rằng ls
lệnh không liên quan. Công việc ls
không thực sự hiển thị danh sách các tệp, mặc dù điều đó xảy ra khi bạn gọi nó trên một thư mục. Trường hợp ls
hữu ích là hiển thị các thuộc tính tệp (thời gian sửa đổi, quyền, kích thước, v.v.). Để chỉ làm một cái gì đó trên một loạt các file phù hợp với một mô hình ký tự đại diện nào đó, của vỏ globs là đủ.
Trình chỉnh sửa đủ nâng cao cho phép bạn làm điều này từ bên trong. Ví dụ, trong Emacs, chỉ cần sử dụng lệnh mở tệp thông thường ( C-x C-f
) và nhập *.txt
.
Nếu bạn cũng muốn khớp các tệp trong thư mục con, trong zsh hoặc bash ≥4, bạn có thể sử dụng $EDITOR **/*.txt
.
Nó phụ thuộc vào một số sắc thái của trình soạn thảo văn bản của bạn. Các trình soạn thảo nâng cao có thể có thể xử lý việc mở nhiều tệp từ dòng lệnh trong một trường hợp. Nhưng giả sử, ví dụ, trình soạn thảo của bạn ($ EDITOR trong các ví dụ của tôi bên dưới) chỉ có thể mở một lần. Bạn nên đặt đầu ra của một thích hợp find
vào xargs
. Điều này cũng phụ thuộc vào $ EDITOR không chiếm TTY (vì vậy, sử dụng đồ họa)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Nếu bạn muốn sử dụng trình chỉnh sửa bảng điều khiển, vòng lặp shell có thể phù hợp hơn, nhưng nếu thất bại đối với nhiều tên tệp không phổ biến (bằng cách thu gọn hoặc thay thế các ký tự khoảng trắng và nhiều thứ khác):
for i in *.c; do $EDITOR "$i"; done
for
trường hợp này sẽ thất bại đối với nhiều tên tệp, bao gồm thu gọn / thay đổi các ký tự khoảng trắng.
for
trường hợp này sẽ hoạt động với mọi tên tệp (ngoại trừ các tên có thể bắt đầu bằng -
hoặc +
với một số trình soạn thảo; for i in ./*.c
sẽ khắc phục điều đó).
editor-command *.css
, v.v.