Öffnen Sie ein Dokument über das Terminal, aber nicht über den Namen

19

Ist es möglich, eine Datei über das Terminal nicht anhand ihres Namens, sondern anhand ihrer Position (Nummer) im Ordner zu öffnen? Oder irgendeine andere Option?

Weil der Name zu lang ist.

yh yeah
quelle
5
Bitte bearbeiten Sie und geben Sie ein Beispiel für das, was Sie tun möchten.
Dessert
7
Nein, nicht ohne es zu codieren. Sie können jedoch die "Tab" -Vervollständigung verwenden.
Rinzwind
2
Zu lange für was?
Carl Witthoft
2
Haben Sie versucht, die ersten zwei oder drei Buchstaben des Dateinamens einzugeben und dann die TabTaste zu drücken?
Henrique

Antworten:

44

Wahrscheinlich haben Sie die Tab-completion (siehe hier ) noch nicht entdeckt .

Während Sie einen Dateinamen in Terminal eingeben, geben Sie einfach die ersten Buchstaben ein und drücken Sie Tabund sehen Sie Magic!

Pomsky
quelle
7
Oder geben Sie einfach die ersten Buchstaben des Dateinamens ein und a *, wenn Sie aus irgendeinem Grund die Tabulatorvervollständigung nicht verwenden möchten. Oder selbst *abc*wenn der Dateiname abcirgendwo enthält (versuchen Sie, ein für den gewünschten Dateinamen eindeutiges Untermuster zu verwenden). Oder kopieren Sie den Dateinamen einfach mit der Maus.
Guntram Blohm unterstützt Monica
4
@guntram Oder Sie können Dateien auf das Terminal ziehen und dort ablegen.
Pomsky
6
@GuntramBlohm du solltest das eine Antwort machen. Ich denke, es ist ausreichend anders als diese Antwort, um für sich allein zu stehen.
DQdlM
32

Nur zum Spaß, buchstäblich die Frage zu beantworten:

Bildbeschreibung hier eingeben

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

Wie es in der Praxis funktioniert

  1. Führen Sie im Terminal im Arbeitsverzeichnis "o" aus (als Befehl)
  2. Der Inhalt des aktuellen Verzeichnisses wird nummeriert aufgelistet. Wählen Sie die Nummer und der Artikel wird geöffnet:

    Bildbeschreibung hier eingeben

Installieren

...ist einfach:

  1. Erstellen Sie, falls noch nicht vorhanden, einen Ordner namens "bin" in Ihrem Home-Verzeichnis
  2. Kopieren Sie das Skript in eine leere Datei, speichern Sie es als "o" (keine Erweiterung) und machen Sie es ausführbar
  3. Melden Sie sich ab und wieder an und verwenden Sie den Befehl, indem Sie einfach Folgendes eingeben

    $ o
    

    im Terminal

NB

Wenn Sie auch versteckte Dateien anzeigen möchten, ändern Sie

show_hidden = False

in:

show_hidden = True
Jacob Vlijm
quelle
1
Wenn ~/bines nicht bereits in Ihrem PATH enthalten ist, müssen Sie es hinzufügen (z. B. eine Zeile wie export PATH="$PATH:~/bin"in .bashrcoder .profile
Nick Matteo
Siehe b0fhs Antwort - dies scheint eine eingebaute von Bash zu sein
Margarciaisaia
1
@kundor nein, nicht auf Ubuntu. Abmelden und einloggen erledigt den Job oder einfach source ~/.profile.
Jacob Vlijm
@JacobVlijm ~/binist überhaupt nicht in irgendetwas eingebaut. Ubuntu und Debian werden mit Custom ausgeliefert ~/.profile, das Linien hat if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. Unter Mac OS X und CentOS müssen Sie dies selbst konfigurieren. Eine gute Chance besteht darin, dass, wenn Ubuntu einer Person von der IT-Abteilung zur Verfügung gestellt wird, die Wahrscheinlichkeit groß ist, dass Ubuntu ~/.profilenicht mit dem Standard-Ubuntu identisch ~/binist. Bash kann auch ignorieren, ~/.profilewenn Sie die Shell mit der --no-profileOption
Sergiy Kolodyazhnyy
@ Margarciaisaia Original Kommentar war für Sie gedacht, eigentlich ^
Sergiy Kolodyazhnyy
28

Es gibt eine wenig bekannte Funktion in Bash, mit der Sie dies tun können, ohne Python oder ein anderes Tool von Drittanbietern aufzurufen, und mit einer einzigen Zeile:

select file in *; do open "$file"; break; done
b0fh
quelle
8
Ausgezeichnet! openNormalerweise funktioniert dies jedoch nicht (es sei denn, Sie verwenden Mac OS). xdg-openwird wahrscheinlich den Trick auf den meisten GNU / Linux Systemen machen.
Nick Matteo
1
Aber bash ist nicht die einzige Shell, die es gibt :-)
jamesqf
16

In der reinen Bash mit der selectAnweisung:

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

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

Das Einstellen von PS3 ist nur ein Kinderspiel. Wenn Sie es weglassen, erhalten Sie nur die Standard-Eingabeaufforderung. Wenn Sie die break-Anweisung weglassen, wird die select-Anweisung so lange wiederholt, bis Sie STRG-D oder STRG-C drücken.

Natürlich können Sie es auch als Einzeiler betreiben:

select file in *; do xdg-open "$file"; break; done
Oscar
quelle
Einfach genug für eine Lösung und funktioniert gut genug. Sie können noch einen Schritt weiter gehen und daraus einen Alias ​​oder eine Funktion
erstellen
7

Sie können mcMidnight Commander installieren und verwenden . Es handelt sich um eine Textbenutzeroberfläche mit Menüs usw., die vom alten Norton Commander inspiriert wurde und bei der Verwendung von MSDOS (vor Windows) beliebt war.

sudo apt update
sudo apt install mc

und starten Sie es in einem Terminalfenster oder in einem Textbildschirm,

mc
Sudodus
quelle
5

$ ls

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

Wie wäre es mit

ls | sed -n 3p

Druckt den 3. Dateinamen

Templates

Öffne es-

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

Funktioniert normalerweise.

Schreiben Sie es in ein Skript

#!/bin/bash

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

Name des Skripts: offen

Speichern Sie es im Home-Ordner. Lauf:

./open file_number
U / min
quelle
3

Auf Linux-Dateisystemen haben Dateinamen eine sehr interessante Eigenschaft namens inode : Ein Verzeichnis (oder Ordner) ist eine Liste von Inodes und welche Dateinamen auf diese Inodes verweisen. Wenn Sie also die Inode-Nummer kennen, können Sie versuchen, die Datei mit dem findDienstprogramm zu finden und bestimmte Vorgänge auszuführen. Dies ist besonders nützlich, wenn Sie mit Dateinamen in einem anderen Gebietsschema oder mit Sonderzeichen arbeiten oder wenn Sie versehentlich ein Verzeichnis mit dem Namen erstellt haben~ .

Beispielsweise,

$ 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

Dies durchläuft das aktuelle Arbeitsverzeichnis (dargestellt durch .) und sucht nach einem Verzeichniseintrag, der eine Datei mit der Inode-Nummer 1103743 ist. Wenn die Datei gefunden wird, xdg-openwird die Datei mit der Standardanwendung geöffnet und findanschließend beendet. Der Grund für das Extra -andund -quitist das Verhindern des xdg-openerneuten Öffnens der Datei, wenn feste Links zu der Datei vorhanden sind (was dem zweimaligen Öffnen derselben Datei entspricht).

Sergiy Kolodyazhnyy
quelle
1

Machen Sie einige Dateien:

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

Legen Sie die Dateien in eine Variable und öffnen Sie die Datei durch einen Index.

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

Ersetzen Sie 12durch den Index, den Sie öffnen möchten.

user1717828
quelle
Ich würde {00..20} anstelle von $ (seq -w 0 20) bevorzugen, weil es nur einen externen Prozess weniger gibt, um zu spawnen. Bei der Portabilität bin ich mir allerdings nicht sicher. Könnte ein bash-ism sein .. ;-)
Oscar
0

Dies ist wahrscheinlich die einfachste Antwort, die die Frage direkt beantwortet. Versuche Folgendes:

touch file-1 file-2 file-3

Angenommen, wir möchten die zweite Datei öffnen (oder bearbeiten), dann können wir Folgendes tun:

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

Dies gibt den Namen der zweiten Datei aus, die wir als Eingabe für den Befehl verwenden können, den wir ausführen möchten. Beispiel:

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

gibt den Inhalt der zweiten Datei aus.

Beachten Sie, dass Sie die Reihenfolge ändern können, in der die Dateien von ls gedruckt werden, indem Sie ls-Argumente anpassen (siehe man lsDetails).

[UPDATE] Dies setzt voraus, dass die Dateinamen keine Leerzeichen enthalten.
Vielen Dank an @wjandrea für Ihre Beobachtung.


quelle
2
Dies schlägt für Dateinamen fehl, die Leerzeichen enthalten. Diese Antwort umgeht das, aber es ist immer noch eine schlechte Idee, es zu analysieren ls. Auch Backticks sind veraltet. Verwenden Sie $()stattdessen.
wjandrea