Відкрийте документ з терміналу, але не за його назвою


19

Чи можливо відкрити файл з терміналу не за його іменем, а за його (номером) позицією в папці? Або будь-який інший варіант?

Тому що назва занадто довга.


5
Будь ласка , редагувати і дати приклад того , що ви хочете зробити.
десерт

7
Ні, не без кодування. Але ви можете використовувати завершення «вкладки».
Rinzwind

2
Занадто довго для чого?
Карл Віттофт

2
Ви спробували ввести перші дві-три літери імені файлу, а потім натисніть Tabклавішу?
Анріке

Відповіді:


44

Напевно, ви ще не виявили Tabзавершення (див. Тут ).

Вводячи ім'я файлу в термінал, просто введіть перші кілька літер і натисніть Tabта побачите магію!


7
Або просто введіть перші кілька літер імені файлу і *, якщо ви чомусь не хочете використовувати доповнення Tab. Або навіть *abc*якщо ім’я файлу abcдесь міститься (спробуйте використовувати підкаталог, унікальний для потрібного імені файлу). Або просто скопіюйте / вставте ім'я файлу за допомогою миші.
Гунтрам Блом підтримує Моніку

4
@guntram Або ви навіть можете перетягувати файли до терміналу.
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. У терміналі, в робочому режимі, запустіть "o" (як команда)
  2. Вміст поточного каталогу перелічено, пронумеровано. Виберіть номер і предмет відкриється:

    введіть тут опис зображення

Налаштуйте

... легко:

  1. Створіть, якщо вона ще не існує, папку з назвою "бін" у вашому домашньому каталозі
  2. Скопіюйте скрипт у порожній файл, збережіть його як (буквально) "o" (без розширення) та зробіть його виконуваним
  3. Вийдіть із системи та поверніться та почніть використовувати команду, просто ввівши команду

    $ o
    

    в терміналі

NB

Якщо ви також хочете показати приховані файли, змініть

show_hidden = False

в:

show_hidden = True

1
Якщо вас ~/binще немає у вашому PATH, вам доведеться додати його (наприклад, поставити рядок, як export PATH="$PATH:~/bin"у .bashrcабо .profile.)
Нік Маттео,

Дивіться відповідь b0fh - це, здається, вбудоване з bash
mgarciaisaia

1
@kundor nope, не на Ubuntu. Вийдіть і виконайте роботу, або просто source ~/.profile.
Яків Влійм

@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опцією
Сергій Колодяжний,

@mgarciaisaia Оригінальний коментар призначений саме для вас ^
Сергій Колодяжний

28

У Bash є маловідома функція, яка дозволяє це робити без виклику python або будь-якого іншого стороннього інструменту та з одним рядком:

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

8
Відмінно! openзазвичай це не працює (якщо ви не працюєте на Mac OS); xdg-openнапевно, зробить трюк у більшості систем GNU / Linux.
Нік Маттео

1
Але Баш - це не єдиний панцир, який існує :-)
jamesqf

16

У чистому bash, використовуючи selectоператор:

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

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

Налаштування PS3 - це просто око. Якщо ви не залишите його, ви просто отримаєте запит за замовчуванням. Якщо ви не залишите заяву перерви, оператор select буде циклічний, поки ви не натиснете CTRL-D або CTRL-C.

Звичайно, ви можете також запустити його як однолінійний:

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

Досить простого рішення і працює досить добре. Ви можете піти на крок далі і зробити з нього псевдонім або функцію
Сергій Колодяжний,

7

Ви можете встановити та використовувати mc, Midnight Commander. Це текстовий користувальницький інтерфейс з меню тощо, натхненний старим 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 : каталог (або папка) - це список переліку входів, які назви файлів вказують на ці індези. Отже, якщо ви знаєте номер inode, ви можете спробувати знайти файл за допомогою 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

Для цього потрібно пройти поточний робочий каталог (представлений .) і шукати запис каталогу, який є файлом з номером inode 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), оскільки це просто один зовнішній процес, менший для нерестування. Я не впевнений у портативності. Може бути ганебним .. ;-)
Оскар

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. Також застарілі бекстейки. Використовуйте $()замість цього.
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.