Откройте документ из терминала, но не по его имени


19

Можно ли открыть файл из терминала не по его имени, а по его (номеру) положению в папке? Или любой другой вариант?

Потому что имя слишком длинное.


5
Пожалуйста, отредактируйте и приведите пример того, что вы хотите сделать.
десерт

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

2
Слишком долго для чего?
Карл Виттофт

2
Вы пытались ввести первые две или три буквы имени файла, а затем нажать Tabклавишу?
Энрике

Ответы:


44

Вы, вероятно, еще не обнаружили - Tabзавершение (см. Здесь ) еще.

При вводе имени файла в Терминале просто наберите первые несколько букв и нажмите « TabВолшебство»!


7
Или просто введите первые несколько букв имени файла, и a *, если вы не хотите использовать Tab-завершение по какой-то причине. Или даже *abc*если имя файла abcгде-то есть (попробуйте использовать подшаблон, уникальный для имени файла, который вы хотите). Или просто скопируйте / вставьте имя файла с помощью мыши.
Гунтрам Блом поддерживает Монику

4
@guntram Или вы можете даже перетаскивать файлы в терминал.
Помский

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. Создайте, если она еще не существует, папку с именем «bin» в вашем домашнем каталоге
  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 Нет, не в 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
Но bash - не единственная существующая оболочка, знаете ли :-)
jamesqf

16

В чистом bash, используя 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

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

7

Вы можете установить и использовать mcMidnight 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, и какие имена файлов указывают на эти 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

Для этого необходимо просмотреть текущий рабочий каталог (представленный .) и найти запись каталога, представляющую собой файл с номером индекса 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.