Làm thế nào để tôi mở tất cả các tệp là kết quả của lệnh ls?


10

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:


12

Gilles hoàn toàn chính xác , lslà 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 lsgì 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 filesẽ 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 forvò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.



@Gilles: Ghi chú đúng, cảm ơn vì đã chỉ ra điều hiển nhiên mà tất cả chúng ta không thể nhìn thấy. @ c0smikdebris Lưu ý rằng tôi chỉ viết lại hoàn toàn câu trả lời của mình bao gồm cả trường hợp nếu bạn không có cách khớp rõ ràng với tập tin nào chỉ bằng tên của họ.
Caleb

$ () là những gì tôi đã thực sự tìm kiếm. Tôi nên đề cập rằng tôi đang sử dụng ls làm ví dụ ở đây. +1 cho cả hai câu trả lời.
c0smikdebris

"biên tập viên yêu thích của tôi". Không cần chỉ định, @Caleb, vì nó rõ ràng ít nhiều từ đầu câu trả lời, ahahah! Các biên tập viên tốt nhất bao giờ hết!
Enrico Maria De Angelis

4

Để 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 $EDITORlà biên tập viên yêu thích của bạn, ví dụ như gedit *.txt, nano *.txt, vim *.txt, emacs *.txthoặ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 lslệnh không liên quan. Công việc lskhô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 lshữ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.


Đó là thực sự cụ thể biên tập. Không có gì đảm bảo tất cả các trình soạn thảo sẽ coi tất cả các đối số dòng lệnh miễn phí của họ là các tệp để mở, cũng như không hỗ trợ mở nhiều tệp cùng một lúc.
jmtd

2

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 findvà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

2
Đừng phân tích đầu ra của ls! Sử dụng $EDITOR *.choặc for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO- ngừng trở nên xấu xa'

Bắt tốt - chỉnh sửa thích hợp.
jmtd

Lưu ý rằng fortrườ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.
jmtd

Như được viết bây giờ, fortrườ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 ./*.csẽ khắc phục điều đó).
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.