Можно ли открыть файл из терминала не по его имени, а по его (номеру) положению в папке? Или любой другой вариант?
Потому что имя слишком длинное.
Tab
клавишу?
Можно ли открыть файл из терминала не по его имени, а по его (номеру) положению в папке? Или любой другой вариант?
Потому что имя слишком длинное.
Tab
клавишу?
Ответы:
Вы, вероятно, еще не обнаружили - Tabзавершение (см. Здесь ) еще.
При вводе имени файла в Терминале просто наберите первые несколько букв и нажмите « TabВолшебство»!
*
, если вы не хотите использовать Tab-завершение по какой-то причине. Или даже *abc*
если имя файла abc
где-то есть (попробуйте использовать подшаблон, уникальный для имени файла, который вы хотите). Или просто скопируйте / вставьте имя файла с помощью мыши.
Просто для удовольствия, буквально отвечая на вопрос:
#!/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]])
Содержимое текущего каталога перечислено, пронумеровано. Выберите номер, и товар откроется:
...легко:
Выйдите из системы, войдите в нее и начните использовать команду, просто набрав
$ o
в терминале
Если вы хотите показать скрытые файлы, измените
show_hidden = False
в:
show_hidden = True
~/bin
еще нет в вашей переменной PATH, вам придется добавить его (например, поставить строку, например, export PATH="$PATH:~/bin"
в .bashrc
или .profile
.)
source ~/.profile
.
~/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
опцией
В Bash есть малоизвестная функция, которая позволяет вам делать это без вызова Python или любого другого стороннего инструмента и с помощью одной строки:
select file in *; do open "$file"; break; done
open
как правило, не работает, хотя (если вы не на Mac OS); xdg-open
вероятно, добьется цели в большинстве систем GNU / Linux.
В чистом 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
Вы можете установить и использовать mc
Midnight Commander. Это текстовый пользовательский интерфейс с меню и т. Д., Вдохновленный старым Norton Commander, который был популярен, когда люди использовали MSDOS (до Windows).
sudo apt update
sudo apt install mc
и запустить его в окне терминала или на текстовом экране,
mc
$ 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
В файловых системах 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
повторное открытие файла, если существуют жесткие ссылки на файл (что эквивалентно открытию одного и того же файла дважды).
Сделайте несколько файлов:
$ 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
индекс, который вы пытаетесь открыть.
Это, вероятно, самый простой ответ, который прямо отвечает на вопрос. попробуйте следующее:
touch file-1 file-2 file-3
Допустим, мы хотим открыть (или отредактировать) второй файл, мы можем сделать следующее:
echo `ls` | cut -d' ' -f2
это выведет имя второго файла, который мы можем использовать в качестве ввода для команды, которую мы хотим выполнить, например:
cat $( echo `ls` | cut -d' ' -f2 )
выведет содержимое второго файла.
обратите внимание, что вы можете изменить порядок, в котором файлы печатаются с помощью ls, путем настройки аргументов ls, см.
man ls
подробности.
[ОБНОВЛЕНИЕ] это предполагает, что у вас нет пробелов в именах файлов,
спасибо @wjandrea за ваши наблюдения.
ls
. Также кавычки не рекомендуются. Используйте $()
вместо этого.