Чи можливо відкрити файл з терміналу не за його іменем, а за його (номером) позицією в папці? Або будь-який інший варіант?
Тому що назва занадто довга.
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 - це просто око. Якщо ви не залишите його, ви просто отримаєте запит за замовчуванням. Якщо ви не залишите заяву перерви, оператор 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, ви можете спробувати знайти файл за допомогою 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
повторному відкриттю файлу, якщо існують жорсткі посилання на файл (що еквівалентно відкриванню одного і того ж файлу двічі).
Створіть кілька файлів:
$ 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
. Також застарілі бекстейки. Використовуйте $()
замість цього.