เปิดเอกสารจากเทอร์มินัล แต่ไม่ใช่ตามชื่อ


19

เป็นไปได้หรือไม่ที่จะเปิดไฟล์จากเครื่องเทอร์มินัลไม่ใช่โดยชื่อ แต่ด้วยตำแหน่ง (หมายเลข) ในโฟลเดอร์? หรือตัวเลือกอื่น ๆ

เพราะชื่อยาวเกินไป


5
โปรดแก้ไขและยกตัวอย่างสิ่งที่คุณต้องการทำ
ของหวาน

7
ไม่ไม่เข้ารหัสไม่ได้ แต่คุณสามารถใช้ "แท็บ" เสร็จสิ้น
Rinzwind

2
นานเกินไปสำหรับอะไร
Carl Witthoft

2
คุณลองพิมพ์อักษรสองหรือสามตัวแรกของชื่อไฟล์แล้วกดTabปุ่ม?
Henrique

คำตอบ:


44

คุณอาจยังไม่ได้ค้นพบความTabสมบูรณ์ (ดูที่นี่ )

ในขณะที่พิมพ์ชื่อไฟล์ใน Terminal เพียงพิมพ์ตัวอักษรสองสามตัวแรกแล้วกดTabและดูเวทมนตร์!


7
หรือเพียงพิมพ์ตัวอักษรสองสามตัวแรกของชื่อไฟล์และ a *หากคุณไม่ต้องการใช้การเติมข้อมูลด้วยแท็บด้วยเหตุผลบางประการ หรือแม้ว่า*abc*ชื่อไฟล์จะมีที่abcใดที่หนึ่ง (ลองใช้รูปแบบย่อยที่ไม่ซ้ำกับชื่อไฟล์ที่คุณต้องการ) หรือเพียงแค่คัดลอก / วางชื่อไฟล์โดยใช้เมาส์
Guntram Blohm สนับสนุน Monica

4
@guntram หรือคุณสามารถลากและวางไฟล์ไปยัง Terminal ได้
pomsky

6
@GuntramBlohm คุณควรทำคำตอบนั้น ฉันคิดว่ามันแตกต่างจากคำตอบนี้มากพอที่จะยืนหยัดอยู่ได้
DQdlM

32

เพื่อความสนุกตอบคำถามอย่างแท้จริง:

ป้อนคำอธิบายรูปภาพที่นี่

#!/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]])

มันทำงานอย่างไรในทางปฏิบัติ

  1. ในเทอร์มินัลใน dir ที่ทำงานให้รัน "o" (เป็นคำสั่ง)
  2. เนื้อหาของไดเรกทอรีปัจจุบันมีการระบุไว้เป็นตัวเลข เลือกหมายเลขและเปิดรายการ:

    ป้อนคำอธิบายรูปภาพที่นี่

ติดตั้ง

...มันง่าย:

  1. สร้างหากยังไม่มีโฟลเดอร์ชื่อ "bin" ในโฮมไดเรกทอรีของคุณ
  2. คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็น (ตัวอักษร) "o" (ไม่มีส่วนขยาย) และทำให้สามารถเรียกใช้งานได้
  3. ออกจากระบบและกลับเข้ามาและเริ่มใช้คำสั่งเพียงพิมพ์

    $ o
    

    ในอาคารผู้โดยสาร

NB

หากคุณต้องการแสดงไฟล์ที่ซ่อนเช่นกันให้เปลี่ยน

show_hidden = False

เป็น:

show_hidden = True

1
หาก~/binยังไม่ได้อยู่ในเส้นทางของคุณคุณจะต้องเพิ่มเข้าไป (เช่นใส่บรรทัดexport PATH="$PATH:~/bin"ใน.bashrcหรือ.profile)
Nick Matteo

ดูคำตอบของ b0fh - นี่น่าจะเป็นแบบในตัวจาก bash
mgarciaisaia

1
@kundor nope ไม่ได้อยู่ใน Ubuntu source ~/.profileออกจากระบบและในไม่ทำงานหรือเพียง
Jacob Vlijm

@JacobVlijm ~/binไม่ได้ถูกสร้างให้เป็นอะไรเลย Ubuntu และ Debian เรือที่มีกำหนดเองที่มีเส้น~/.profile if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fiใน Mac OS X และ CentOS คุณต้องกำหนดค่าด้วยตัวเอง โอกาสที่ดีคือถ้า Ubuntu ให้แผนกไอทีแก่บุคคลโอกาสที่~/.profileจะไม่เหมือนกับ Ubuntu เริ่มต้นดังนั้นจึงควรระวังที่~/binไม่ได้มาตรฐาน Bash สามารถเพิกเฉย~/.profileหากคุณเปิดตัวเชลล์ด้วย--no-profileตัวเลือก
Sergiy Kolodyazhnyy

@mgarciaisaia ความคิดเห็นดั้งเดิมมีความหมายสำหรับคุณจริงๆแล้ว ^
Sergiy Kolodyazhnyy

28

มีคุณสมบัติที่รู้จักกันน้อยในทุบตีที่ช่วยให้คุณทำเช่นนี้โดยไม่ต้องเรียกร้องให้งูหลามหรือเครื่องมือของบุคคลที่สามอื่น ๆ และมีเส้นเดียวคือ

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

8
ยอดเยี่ยม openโดยทั่วไปแล้วจะไม่ทำงาน (ยกเว้นว่าคุณใช้ Mac OS) xdg-openอาจจะทำเคล็ดลับในระบบ GNU / Linux ส่วนใหญ่
Nick Matteo

1
แต่ทุบตีไม่ได้เป็นเพียงเปลือกในการดำรงอยู่คุณรู้ :-)
jamesqf

16

ในทุบตีบริสุทธิ์ใช้selectคำสั่ง:

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

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

การตั้งค่า PS3 เป็นเรื่องที่น่ากลัวมาก ถ้าคุณปล่อยให้มันออกมาคุณก็จะได้รับพรอมต์เริ่มต้น หากคุณไม่ใช้คำสั่ง break คำสั่ง select จะวนซ้ำจนกว่าคุณจะกด CTRL-D หรือ CTRL-C

แน่นอนคุณยังสามารถเรียกใช้มันเป็นหนึ่งซับ:

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

แก้ปัญหาได้ง่ายพอและทำงานได้ดีพอ คุณสามารถก้าวไปอีกขั้นหนึ่งและสร้างนามแฝงหรือทำหน้าที่ได้
Sergiy Kolodyazhnyy

7

คุณสามารถติดตั้งและใช้งานmc, ผู้บัญชาการเที่ยงคืน เป็นอินเทอร์เฟซผู้ใช้ข้อความพร้อมเมนูและอื่น ๆ ที่ได้รับแรงบันดาลใจจาก Norton Commander เก่าซึ่งเป็นที่นิยมเมื่อผู้ใช้ MSDOS (ก่อน Windows)

sudo apt update
sudo apt install mc

และเริ่มต้นในหน้าต่างเทอร์มินัลหรือในหน้าจอข้อความ

mc

5

$ ls

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

วิธีการแข่งขัน

ls | sed -n 3p

พิมพ์ชื่อไฟล์ที่ 3

Templates

เปิด-

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

มักจะใช้งานได้

ใส่ไว้ในสคริปต์

#!/bin/bash

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

ชื่อของสคริปต์: เปิด

บันทึกไว้ในโฟลเดอร์บ้าน วิ่ง:

./open file_number



3

บนระบบไฟล์ Linux ชื่อไฟล์มีคุณสมบัติที่น่าสนใจมากที่เรียกว่าinode : a directory (หรือโฟลเดอร์) คือรายชื่อของ inodes และชื่อไฟล์ที่ชี้ไปที่ inodes เหล่านั้น ดังนั้นถ้าคุณรู้หมายเลขไอโหนดคุณสามารถพยายามค้นหาไฟล์โดยใช้findยูทิลิตี้และทำการดำเนินการบางอย่างกับมัน นี้จะเป็นประโยชน์โดยเฉพาะอย่างยิ่งเมื่อต้องรับมือกับชื่อไฟล์ในสถานที่ที่แตกต่างกันอักขระพิเศษหรือเมื่อคุณตั้งใจไดเรกทอรีที่สร้างขึ้นเรียกว่า~

ตัวอย่างเช่น,

$ 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

สิ่งนี้ทำคือสำรวจไดเรกทอรีการทำงานปัจจุบัน (แสดงโดย.) และค้นหารายการไดเรกทอรีที่เป็นไฟล์ที่มีหมายเลขไอโหนด 1103743 หากพบไฟล์xdg-openจะเปิดไฟล์ที่มีแอปพลิเคชันเริ่มต้นและfindจะออกหลังจากนั้น เหตุผลของการเสริม-andและ-quitเพื่อป้องกันการxdg-openเปิดไฟล์อีกครั้งหากมีการเชื่อมโยงอย่างหนักไปยังไฟล์ (ซึ่งเทียบเท่ากับการเปิดไฟล์เดียวกันสองครั้ง)


1

สร้างไฟล์บางไฟล์:

$ 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.

วางไฟล์ลงในตัวแปรแล้วเปิดไฟล์โดยใช้ดัชนี

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

แทนที่12ด้วยดัชนีที่คุณพยายามจะเปิด


ฉันต้องการ {00..20} แทน $ (seq -w 0 20) เพราะมันเป็นเพียงกระบวนการภายนอกที่จะวางไข่ ฉันไม่แน่ใจเกี่ยวกับการพกพา อาจเป็นทุบตี - ism .. ;-)
ออสกา

0

นี่อาจเป็นคำตอบที่ง่ายที่สุดที่ตอบคำถามโดยตรง ลองต่อไปนี้:

touch file-1 file-2 file-3

สมมติว่าเราต้องการเปิด (หรือแก้ไข) ไฟล์ที่สองเราสามารถทำสิ่งต่อไปนี้:

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

สิ่งนี้จะเอาท์พุทชื่อของไฟล์ที่สองซึ่งเราสามารถใช้เป็นอินพุตไปยังคำสั่งที่เราต้องการดำเนินการตัวอย่างเช่น:

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

จะเอาท์พุทเนื้อหาของไฟล์ที่สอง

โปรดทราบว่าคุณสามารถเปลี่ยนลำดับที่ไฟล์ถูกพิมพ์โดย ls โดยการปรับแต่ง ls อาร์กิวเมนต์ดูman lsรายละเอียด

[อัพเดต] นี่ถือว่าคุณไม่มีช่องว่างสีขาวในชื่อไฟล์
ขอบคุณ @wjandrea สำหรับการสังเกตของคุณ


2
สิ่งนี้จะล้มเหลวสำหรับชื่อไฟล์ที่มีช่องว่าง คำตอบนี้ได้รับรอบ lsแต่ก็ยังคงเป็นความคิดที่ดีที่จะแยก backticks ก็จะถูกคัดค้านเช่นกัน ใช้$()แทน
wjandrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.