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.
Tab
Taste zu drücken?
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.
Tab
Taste zu drücken?
Antworten:
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!
*
, wenn Sie aus irgendeinem Grund die Tabulatorvervollständigung nicht verwenden möchten. Oder selbst *abc*
wenn der Dateiname abc
irgendwo enthält (versuchen Sie, ein für den gewünschten Dateinamen eindeutiges Untermuster zu verwenden). Oder kopieren Sie den Dateinamen einfach mit der Maus.
Nur zum Spaß, buchstäblich die Frage zu beantworten:
#!/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]])
Der Inhalt des aktuellen Verzeichnisses wird nummeriert aufgelistet. Wählen Sie die Nummer und der Artikel wird geöffnet:
...ist einfach:
Melden Sie sich ab und wieder an und verwenden Sie den Befehl, indem Sie einfach Folgendes eingeben
$ o
im Terminal
Wenn Sie auch versteckte Dateien anzeigen möchten, ändern Sie
show_hidden = False
in:
show_hidden = True
~/bin
es nicht bereits in Ihrem PATH enthalten ist, müssen Sie es hinzufügen (z. B. eine Zeile wie export PATH="$PATH:~/bin"
in .bashrc
oder .profile
source ~/.profile
.
~/bin
ist ü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 ~/.profile
nicht mit dem Standard-Ubuntu identisch ~/bin
ist. Bash kann auch ignorieren, ~/.profile
wenn Sie die Shell mit der --no-profile
Option
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
open
Normalerweise funktioniert dies jedoch nicht (es sei denn, Sie verwenden Mac OS). xdg-open
wird wahrscheinlich den Trick auf den meisten GNU / Linux Systemen machen.
In der reinen Bash mit der select
Anweisung:
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
Sie können mc
Midnight 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
$ 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
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 find
Dienstprogramm 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-open
wird die Datei mit der Standardanwendung geöffnet und find
anschließend beendet. Der Grund für das Extra -and
und -quit
ist das Verhindern des xdg-open
erneuten Öffnens der Datei, wenn feste Links zu der Datei vorhanden sind (was dem zweimaligen Öffnen derselben Datei entspricht).
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 12
durch den Index, den Sie öffnen möchten.
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 ls
Details).
[UPDATE] Dies setzt voraus, dass die Dateinamen keine Leerzeichen enthalten.
Vielen Dank an @wjandrea für Ihre Beobachtung.
ls
. Auch Backticks sind veraltet. Verwenden Sie $()
stattdessen.