Otwórz dokument z terminala, ale nie według jego nazwy

19

Czy można otworzyć plik z terminala nie po nazwie, ale po jego (numerowej) pozycji w folderze? Lub jakaś inna opcja?

Ponieważ nazwa jest za długa.

tak
źródło
5
Podobać się zmienił i dać przykład tego, co chcesz zrobić.
deser
7
Nie, nie bez kodowania. Możesz jednak użyć uzupełniania „zakładki”.
Rinzwind
2
Za długo na co?
Carl Witthoft
2
Czy próbowałeś wpisać pierwsze dwie lub trzy litery nazwy pliku, a następnie naciśnij Tabklawisz?
Henrique

Odpowiedzi:

44

Prawdopodobnie jeszcze nie Tabodkryłeś -completion (patrz tutaj ).

Podczas wpisywania nazwy pliku w Terminalu wystarczy wpisać kilka pierwszych liter i nacisnąć Tabi zobaczyć magię!

pomsky
źródło
7
Lub po prostu wpisz kilka pierwszych liter nazwy pliku oraz a *, jeśli z jakiegoś powodu nie chcesz używać uzupełniania tabulatorami. Lub nawet *abc*jeśli nazwa pliku abcgdzieś zawiera (spróbuj użyć wzorca unikalnego dla żądanej nazwy pliku). Lub po prostu skopiuj / wklej nazwę pliku za pomocą myszy.
Guntram Blohm wspiera Monikę
4
@ guntram Lub możesz nawet przeciągać i upuszczać pliki do terminala.
pomsky
6
@GuntramBlohm powinieneś udzielić odpowiedzi. Myślę, że wystarczająco różni się od tej odpowiedzi, aby stać samodzielnie.
DQdlM
32

Dla zabawy, dosłownie odpowiadając na pytanie:

wprowadź opis zdjęcia tutaj

#!/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]])

Jak to działa w praktyce

  1. W terminalu, w działającym katalogu, uruchom „o” (jako polecenie)
  2. Zawartość bieżącego katalogu jest wymieniona, ponumerowana. Wybierz numer, a przedmiot zostanie otwarty:

    wprowadź opis zdjęcia tutaj

Ustawiać

...jest proste:

  1. Utwórz, jeśli jeszcze nie istnieje, folder o nazwie „bin” w katalogu domowym
  2. Skopiuj skrypt do pustego pliku, zapisz go jako (dosłownie) „o” (bez rozszerzenia) i uczyń go wykonywalnym
  3. Wyloguj się, zaloguj ponownie i zacznij korzystać z polecenia, pisząc

    $ o
    

    w terminalu

NB

Jeśli chcesz również pokazać ukryte pliki, zmień

show_hidden = False

w:

show_hidden = True
Jacob Vlijm
źródło
1
Jeśli ~/binnie ma go jeszcze w ŚCIEŻCE, musisz go dodać (na przykład wstawić wiersz podobny export PATH="$PATH:~/bin"do .bashrclub .profile.)
Nick Matteo
Zobacz odpowiedź b0fh - wydaje się, że jest to wbudowana
funkcja
1
@kundor nie, nie na Ubuntu. Wyloguj się i zaloguj się lub po prostu source ~/.profile.
Jacob Vlijm
@JacobVlijm ~/binw ogóle nie jest wbudowany w nic. Ubuntu i Debian są dostarczane z niestandardowymi ~/.profileliniami if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. W Mac OS X i CentOS musisz to skonfigurować samodzielnie. Dobrą szansą jest to, że jeśli Ubuntu jest dostarczany osobie przez dział IT, są szanse, że ~/.profilenie będzie taki sam jak domyślny Ubuntu, więc dobrą praktyką jest zawsze uważać, co ~/binnie jest standardowe. Bash może również zignorować, ~/.profilejeśli uruchomisz powłokę z --no-profileopcją
Sergiy Kolodyazhnyy
@mgarciaisaia Oryginalny komentarz był przeznaczony właśnie dla ciebie ^
Sergiy Kolodyazhnyy
28

W Bash istnieje mało znana funkcja, która pozwala to zrobić bez wywoływania Pythona lub innego narzędzia innej firmy i za pomocą jednej linii:

select file in *; do open "$file"; break; done
b0fh
źródło
8
Doskonały! openzazwyczaj jednak nie działa (chyba że masz system Mac OS); xdg-openprawdopodobnie zrobi to samo na większości systemów GNU / Linux.
Nick Matteo
1
Ale bash nie jest jedyną istniejącą powłoką, wiesz :-)
jamesqf
16

W czystym bashu, używając selectinstrukcji:

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

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

Ustawienie PS3 jest po prostu efektowne. Jeśli go pominiesz, zobaczysz tylko domyślny monit. Jeśli pominiesz instrukcję break, instrukcja select będzie się zapętlać, dopóki nie naciśniesz CTRL-D lub CTRL-C.

Oczywiście możesz również uruchomić go jako jeden wiersz:

select file in *; do xdg-open "$file"; break; done
Oscar
źródło
Dość proste rozwiązanie i działa wystarczająco dobrze. Możesz pójść o krok dalej i stworzyć z niego alias lub funkcję
Sergiy Kolodyazhnyy
7

Możesz zainstalować i używać mcMidnight Commander. Jest to tekstowy interfejs użytkownika z menu itp. Zainspirowany starym programem Norton Commander, który był popularny, gdy ludzie korzystali z MSDOS (przed Windows).

sudo apt update
sudo apt install mc

i uruchom go w oknie terminala lub na ekranie tekstowym,

mc
sudodus
źródło
5

$ ls

results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh

Może

ls | sed -n 3p

Wyświetla trzecią nazwę pliku

Templates

Otwórz to-

xdg-open "$(ls | sed -n 3p)"

Zwykle działa.

Umieść to w skrypcie

#!/bin/bash

xdg-open "$(ls | sed -n "$1"p)"

Nazwa skryptu: otwarty

Zapisz go w folderze domowym. Biegać:

./open file_number
MeasSelf
źródło
3

W systemach plików Linux nazwy plików mają bardzo interesującą właściwość o nazwie i- węzeł : katalog (lub folder) to lista i-węzłów i które nazwy plików wskazują na te i-węzły. Tak więc, jeśli znasz numer i-węzła, możesz spróbować zlokalizować plik za pomocą findnarzędzia i wykonać na nim określone operacje. Jest to szczególnie przydatne, gdy mamy do czynienia z nazwami plików w różnych lokalizacjach, znakach specjalnych lub gdy przypadkowo utworzono katalog o nazwie~ .

Na przykład,

$ 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

Przechodzi przez bieżący katalog roboczy (reprezentowany przez .) i szuka wpisu katalogu, który jest plikiem o numerze i-węzła 1103743. Jeśli plik zostanie znaleziony, xdg-openotworzy plik z domyślną aplikacją i findwyjdzie później. Powodem Extra -andi -quitjest zapobieganie xdg-openponownym otwarciu pliku, jeśli istnieją dowiązania do pliku (co jest równoznaczne z otwarciem tego samego pliku dwa razy).

Sergiy Kolodyazhnyy
źródło
1

Zrób kilka plików:

$ 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.

Umieść pliki w zmiennej i otwórz plik według indeksu.

$ files=(*)
$ xdg-open "${files[12]}"
# Opens 12.txt in a text editor, which reads "This is file 12."

Zamień 12na indeks, który próbujesz otworzyć.

użytkownik1717828
źródło
Wolę {00..20} zamiast $ (sekw. -W 0 20), ponieważ jest tylko jeden proces zewnętrzny mniej do odrodzenia. Nie jestem jednak pewien przenośności. Może to być bash-ism .. ;-)
Oscar
0

Jest to prawdopodobnie najprostsza odpowiedź, która bezpośrednio odpowiada na pytanie. spróbuj wykonać następujące czynności:

touch file-1 file-2 file-3

Powiedzmy, że chcemy otworzyć (lub edytować) drugi plik, możemy wykonać następujące czynności:

echo `ls` | cut -d' ' -f2

spowoduje to wyświetlenie nazwy drugiego pliku, którego możemy użyć jako danych wejściowych do polecenia, które chcemy wykonać, na przykład:

cat $( echo `ls` | cut -d' ' -f2 )

wyświetli zawartość drugiego pliku.

Zauważ, że możesz zmienić kolejność, w jakiej pliki są drukowane przez ls, poprawiając argumenty ls, zobacz man lsszczegóły.

[AKTUALIZACJA] zakłada to, że nie masz białych znaków w nazwach plików,
dziękuję @wjandrea za twoją obserwację.


źródło
2
Nie powiedzie się to w przypadku nazw plików zawierających spacje. Ta odpowiedź omija ten problem, ale nadal jest to zły pomysł na analizę ls. Również backticks są przestarzałe. Użyj $()zamiast tego.
wjandrea