Mở một tài liệu từ thiết bị đầu cuối, nhưng không phải bằng tên của nó


19

Có thể mở một tệp từ thiết bị đầu cuối không phải bằng tên của nó mà bởi vị trí (số) của nó trong thư mục? Hoặc bất kỳ lựa chọn khác?

Vì tên quá dài.


5
Vui lòng chỉnh sửa và đưa ra một ví dụ về những gì bạn muốn làm.
tráng miệng

7
Không, không phải không có mã hóa nó. Nhưng bạn có thể sử dụng hoàn thành "tab".
Rinzwind

2
Quá dài cho những gì?
Carl Witthoft

2
Bạn đã thử gõ hai hoặc ba chữ cái đầu tiên của tên tệp rồi nhấn Tabphím chưa?
Henrique

Câu trả lời:


44

Có lẽ bạn chưa phát hiện ra Tab- hoàn thành (xem tại đây ).

Trong khi gõ tên tệp trong Terminal, chỉ cần gõ một vài chữ cái đầu tiên và nhấn Tabvà xem phép thuật!


7
Hoặc chỉ cần nhập một vài chữ cái đầu tiên của tên tệp và a *, nếu bạn không muốn sử dụng hoàn thành Tab vì một số lý do. Hoặc ngay cả *abc*khi tên tệp chứa abcở đâu đó (hãy thử sử dụng một mẫu con duy nhất cho tên tệp bạn muốn). Hoặc chỉ cần sao chép / dán tên tệp bằng chuột.
Guntram Blohm hỗ trợ Monica

4
@guntram Hoặc thậm chí bạn có thể kéo và thả tệp vào Terminal.
pomsky

6
@GuntramBlohm bạn nên làm cho câu trả lời. Tôi nghĩ rằng nó đủ khác với câu trả lời này để tự đứng vững.
DQdlM

32

Chỉ để cho vui, nghĩa đen là trả lời câu hỏi:

nhập mô tả hình ảnh ở đây

#!/usr/bin/env python3
import os
import subprocess

show_hidden = False

currfiles = os.listdir("./")
if not show_hidden:
    currfiles = [f for f in currfiles if not f.startswith(".")]
n = 1
for f in currfiles:
    print(str(n) + ". " + f)
    n = n + 1

picked = int(input("Quick, quick, give me a number:\n"))
subprocess.run(["xdg-open", currfiles[picked - 1]])

Làm thế nào nó hoạt động trong thực tế

  1. Trong thiết bị đầu cuối, trong thư mục làm việc, chạy "o" (dưới dạng lệnh)
  2. Nội dung của thư mục hiện tại được liệt kê, đánh số. Chọn số và mục được mở:

    nhập mô tả hình ảnh ở đây

Thiết lập

...dễ:

  1. Tạo, nếu nó chưa tồn tại, một thư mục có tên "bin" trong thư mục nhà của bạn
  2. Sao chép tập lệnh vào một tệp trống, lưu nó dưới dạng (theo nghĩa đen) "o" (không có phần mở rộng) và làm cho nó có thể thực thi được
  3. Đăng xuất và đăng nhập trở lại và bắt đầu sử dụng lệnh bằng cách chỉ cần gõ

    $ o
    

    trong thiết bị đầu cuối

Lưu ý

Nếu bạn cũng muốn hiển thị các tập tin ẩn, hãy thay đổi

show_hidden = False

vào:

show_hidden = True

1
Nếu ~/binchưa có trong PATH của bạn, bạn sẽ phải thêm nó (ví dụ: đặt một dòng như export PATH="$PATH:~/bin"vào .bashrchoặc .profile.)
Nick Matteo

Xem câu trả lời của b0fh - đây có vẻ là một tích hợp từ bash
mgarciaisaia

1
@kundor không, không phải trên Ubuntu. Đăng xuất và thực hiện công việc, hoặc đơn giản source ~/.profile.
Jacob Vlijm

@JacobVlijm hoàn toàn ~/binkhông được tích hợp vào bất cứ thứ gì. Ubuntu và Debian xuất xưởng với tùy chỉnh ~/.profilecó dòng if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. Trên Mac OS X và CentOS, bạn phải tự cấu hình nó. Một cơ hội tốt là nếu bộ phận CNTT được cung cấp cho một người bởi bộ phận CNTT, thì rất có thể ~/.profilenó sẽ không giống với Ubuntu mặc định, vì vậy, đó là một cách tốt để luôn luôn cảnh giác ~/binkhông đúng tiêu chuẩn. Bash cũng có thể bỏ qua ~/.profilenếu bạn khởi chạy shell với --no-profiletùy chọn
Sergiy Kolodyazhnyy

@mgarciaisaia Nhận xét ban đầu là dành cho bạn, thực sự ^
Sergiy Kolodyazhnyy

28

Có một tính năng ít được biết đến trong Bash cho phép bạn thực hiện việc này mà không cần gọi python hoặc bất kỳ công cụ bên thứ ba nào khác và với một dòng duy nhất:

select file in *; do open "$file"; break; done

8
Xuất sắc! openthường không hoạt động, mặc dù (trừ khi bạn sử dụng Mac OS); xdg-opencó thể sẽ thực hiện thủ thuật trên hầu hết các hệ thống GNU / Linux.
Nick Matteo

1
Nhưng bash không phải là vỏ duy nhất trong sự tồn tại, bạn biết đấy :-)
jamesqf

16

Trong bash thuần, sử dụng selectcâu lệnh:

PS3='Quick, quick, give a number: '

select file in *
do 
    xdg-open "$file"
    break
done

Thiết lập PS3 chỉ là mỏi mắt. Nếu bạn để nó ra, bạn sẽ chỉ nhận được lời nhắc mặc định. Nếu bạn bỏ qua câu lệnh break, câu lệnh select sẽ lặp cho đến khi bạn nhấn CTRL-D hoặc CTRL-C.

Tất nhiên bạn cũng có thể chạy nó dưới dạng một lớp lót:

select file in *; do xdg-open "$file"; break; done

Đủ đơn giản của một giải pháp và hoạt động đủ tốt. Bạn có thể tiến thêm một bước và tạo bí danh hoặc hoạt động từ đó
Sergiy Kolodyazhnyy

7

Bạn có thể cài đặt và sử dụng mc, Midnight Commander. Nó là một giao diện người dùng văn bản với các menu vv được lấy cảm hứng từ Norton Commander cũ, rất phổ biến khi mọi người sử dụng MSDOS (trước Windows).

sudo apt update
sudo apt install mc

và khởi động nó trong một cửa sổ đầu cuối hoặc trong một màn hình văn bản,

mc

5

$ ls

results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh

Cai đo thê nao

ls | sed -n 3p

In tên tập tin thứ 3

Templates

Mở nó ra-

xdg-open "$(ls | sed -n 3p)"

Thường hoạt động.

Đặt nó trong một kịch bản

#!/bin/bash

xdg-open "$(ls | sed -n "$1"p)"

Tên của kịch bản: mở

Lưu nó trong thư mục nhà. Chạy:

./open file_number



3

Trên các hệ thống tập tin Linux, tên tệp có một thuộc tính rất thú vị được gọi là inode : một thư mục (hoặc thư mục) là một danh sách các nút và tên tệp đó trỏ đến các nút đó. Vì vậy, nếu bạn biết số inode, bạn có thể cố gắng xác định vị trí tệp bằng findtiện ích và thực hiện một số thao tác trên nó. Điều này đặc biệt hữu ích khi xử lý tên tệp ở các miền khác nhau, các ký tự đặc biệt hoặc khi bạn vô tình tạo thư mục được gọi~ .

Ví dụ,

$ ls -i1
1103993 crs.py
1103743 foobar.txt
1147196 __pycache__
1103739 'with'$'\n''newline.png'
1103740 yellowstone.jpg

$ find . -type f -inum 1103743 -exec xdg-open {} \; -and -quit

Những gì nó làm là đi qua thư mục làm việc hiện tại (được đại diện bởi .) và tìm mục nhập thư mục là một tệp có số inode 1103743. Nếu tìm thấy tệp, xdg-opensẽ mở tệp với ứng dụng mặc định và findsẽ thoát sau đó. Lý do bổ sung -and-quitlà để ngăn xdg-openmở lại tệp nếu có liên kết cứng đến tệp (tương đương với việc mở cùng một tệp hai lần).


1

Tạo một số tệp:

$ for i in $(seq -w 0 20); do echo "This is file $i." > $i.txt; done
$ ls
00.txt  03.txt  06.txt  09.txt  12.txt  15.txt  18.txt
01.txt  04.txt  07.txt  10.txt  13.txt  16.txt  19.txt
02.txt  05.txt  08.txt  11.txt  14.txt  17.txt  20.txt
$ cat 16.txt 
This is file 16.

Đặt các tệp vào một biến và mở tệp theo một chỉ mục.

$ files=(*)
$ xdg-open "${files[12]}"
# Opens 12.txt in a text editor, which reads "This is file 12."

Thay thế 12bằng chỉ mục bạn đang cố mở.


Tôi thích {00..20} thay vì $ (seq -w 0 20) vì đó chỉ là một quá trình bên ngoài ít sinh ra. Tôi không chắc chắn về tính di động mặc dù. Có thể là một bash-ism .. ;-)
Oscar

0

Đây có lẽ là câu trả lời đơn giản nhất trả lời trực tiếp câu hỏi. hãy thử như sau:

touch file-1 file-2 file-3

Giả sử chúng tôi muốn mở (hoặc chỉnh sửa) tệp thứ hai, chúng tôi có thể làm như sau:

echo `ls` | cut -d' ' -f2

điều này sẽ xuất tên của tệp thứ hai, mà chúng ta có thể sử dụng làm đầu vào cho lệnh chúng ta muốn thực hiện, ví dụ:

cat $( echo `ls` | cut -d' ' -f2 )

sẽ xuất nội dung của tập tin thứ hai.

lưu ý rằng bạn có thể thay đổi thứ tự các tệp được in bằng ls, bằng cách điều chỉnh các đối số ls, xem man lsđể biết chi tiết.

[CẬP NHẬT] điều này giả định rằng bạn không có khoảng trắng trong tên tệp,
cảm ơn @wjandrea vì sự quan sát của bạn.


2
Điều này sẽ thất bại cho tên tệp có chứa khoảng trắng. Câu trả lời này xoay quanh vấn đề đó, nhưng vẫn là một ý tưởng tồi để phân tích ls. Backticks cũng không được chấp nhận. Sử dụng $()thay thế.
wjandrea
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.