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.
Tab
phím chưa?
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.
Tab
phím chưa?
Câu trả lời:
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!
*
, 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.
Chỉ để cho vui, nghĩa đen là trả lời câu hỏi:
#!/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]])
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ở:
...dễ:
Đă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
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
~/bin
chư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 .bashrc
hoặc .profile
.)
source ~/.profile
.
~/bin
khô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 ~/.profile
có 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ể ~/.profile
nó 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 ~/bin
không đúng tiêu chuẩn. Bash cũng có thể bỏ qua ~/.profile
nếu bạn khởi chạy shell với --no-profile
tùy chọn
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
open
thường không hoạt động, mặc dù (trừ khi bạn sử dụng Mac OS); xdg-open
có thể sẽ thực hiện thủ thuật trên hầu hết các hệ thống GNU / Linux.
Trong bash thuần, sử dụng select
câ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
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
$ 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
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 find
tiệ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-open
sẽ mở tệp với ứng dụng mặc định và find
sẽ thoát sau đó. Lý do bổ sung -and
và -quit
là để ngăn xdg-open
mở 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).
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ế 12
bằng chỉ mục bạn đang cố mở.
Đâ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.
ls
. Backticks cũng không được chấp nhận. Sử dụng $()
thay thế.