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