Apri un documento dal terminale, ma non con il suo nome


19

È possibile aprire un file dal terminale non con il suo nome ma con la sua posizione (numero) nella cartella? O qualsiasi altra opzione?

Perché il nome è troppo lungo.


5
Si prega di modificare e dare un esempio di ciò che si vuole fare.
dessert il

7
No, non senza codificarlo. Ma puoi usare il completamento "tab".
Rinzwind,

2
Troppo a lungo per cosa?
Carl Witthoft,

2
Hai provato a digitare le prime due o tre lettere del nome del file e poi hai premuto il Tabtasto?
Henrique il

Risposte:


44

Probabilmente non hai ancora scoperto Tab-completion (vedi qui ).

Durante la digitazione di un nome file nel Terminale basta digitare le prime lettere e colpire Tabe vedere la magia!


7
Oppure digita le prime lettere del nome del file e *, se non vuoi usare il completamento con Tab per qualche motivo. O anche *abc*se il nome file contiene abcda qualche parte (prova a utilizzare un sottotatro unico per il nome file desiderato). O semplicemente copia / incolla il nome del file usando il mouse.
Guntram Blohm supporta Monica il

4
@guntram Oppure puoi anche trascinare e rilasciare i file sul Terminale.
pomsky

6
@GuntramBlohm dovresti dare una risposta. Penso che sia sufficientemente diverso da questa risposta per stare da solo.
DQdlM

32

Solo per divertimento, rispondendo letteralmente alla domanda:

inserisci qui la descrizione dell'immagine

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

Come funziona in pratica

  1. Nel terminale, nella directory di lavoro, eseguire "o" (come comando)
  2. Il contenuto della directory corrente è elencato, numerato. Scegli il numero e l'oggetto viene aperto:

    inserisci qui la descrizione dell'immagine

Impostare

...è facile:

  1. Crea, se non esiste ancora, una cartella denominata "bin" nella tua home directory
  2. Copia lo script in un file vuoto, salvalo come (letteralmente) "o" (senza estensione) e rendilo eseguibile
  3. Disconnettersi e riconnettersi e iniziare a utilizzare il comando semplicemente digitando

    $ o
    

    nel terminale

NB

Se desideri mostrare anche i file nascosti, modifica

show_hidden = False

in:

show_hidden = True

1
Se ~/binnon è già nel tuo PERCORSO, dovrai aggiungerlo (ad esempio, inserendo una linea come export PATH="$PATH:~/bin"in .bashrco .profile.)
Nick Matteo

Vedi la risposta di b0fh - questo sembra essere integrato da bash
mgarciaisaia il

1
@kundor no, non su Ubuntu. Disconnettersi e fare il lavoro, o semplicemente source ~/.profile.
Jacob Vlijm,

@JacobVlijm ~/binnon è integrato in nulla. Ubuntu e Debian vengono forniti con ~/.profilelinee personalizzate if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. Su Mac OS X e CentOS devi configurarlo tu stesso. Una buona possibilità è che se Ubuntu viene fornito a una persona dal dipartimento IT, è probabile ~/.profileche non sarà lo stesso di Ubuntu predefinito, quindi è una buona pratica fare sempre attenzione che ~/binnon sia standard. Bash può anche ignorare ~/.profilese --no-profile
avvii

@mgarciaisaia Il commento originale era pensato per te, in realtà ^
Sergiy Kolodyazhnyy il

28

C'è una funzionalità poco conosciuta in Bash che ti permette di farlo senza chiamare su Python o qualsiasi altro strumento di terze parti e con una sola riga:

select file in *; do open "$file"; break; done

8
Eccellente! openin genere non funzionerà, tuttavia (a meno che tu non sia su Mac OS); xdg-openprobabilmente farà il trucco sulla maggior parte dei sistemi GNU / Linux.
Nick Matteo

1
Ma bash non è l'unica shell esistente, sai :-)
jamesqf

16

In puro bash, usando l' selectaffermazione:

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

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

L'impostazione di PS3 è solo oculare. Se lo lasci fuori, otterrai semplicemente il prompt predefinito. Se si omette l'istruzione break, l'istruzione select verrà ripetuta fino a quando non si preme CTRL-D o CTRL-C.

Ovviamente puoi anche eseguirlo come one-liner:

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

Abbastanza semplice di una soluzione e funziona abbastanza bene. Puoi fare un ulteriore passo avanti e creare un alias o farne una funzione
Sergiy Kolodyazhnyy,

7

È possibile installare e utilizzare mcMidnight Commander. È un'interfaccia utente testuale con menu ecc. Ispirata al vecchio Norton Commander, che era popolare quando le persone usavano MSDOS (prima di Windows).

sudo apt update
sudo apt install mc

e avviarlo in una finestra terminale o in una schermata di testo,

mc

5

$ ls

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

Che ne dici

ls | sed -n 3p

Stampa il 3o nome del file

Templates

Aprilo

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

Di solito funziona.

Mettilo in una sceneggiatura

#!/bin/bash

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

Nome dello script: aperto

Salvalo nella cartella home. Correre:

./open file_number



3

Sui filesystem Linux, i nomi dei file hanno una proprietà molto interessante chiamata inode : una directory (o cartella) è un elenco di inode e quali nomi di file puntano a tali inode. Quindi, se conosci il numero di inode, puoi provare a localizzare il file usando l' findutility e fare alcune operazioni su di esso. Ciò è particolarmente utile quando si ha a che fare con nomi di file in diverse impostazioni internazionali, caratteri speciali o quando si è creata accidentalmente una directory chiamata~ .

Per esempio,

$ 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

Ciò che fa è attraversare la directory di lavoro corrente (rappresentata da .) e cercare la voce di directory che è un file con il numero di inode 1103743. Se il file viene trovato, xdg-openaprirà il file con l'applicazione predefinita e findverrà chiuso in seguito. La ragione per l'extra -anded -quitè quello di impedire xdg-openla riapertura del file se esistono collegamenti fisici al file (che equivale ad aprire lo stesso file due volte).


1

Crea alcuni file:

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

Inserisci i file in una variabile e apri il file con un indice.

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

Sostituisci 12con l'indice che stai tentando di aprire.


Preferirei {00..20} invece di $ (seq -w 0 20) perché si genera solo un processo esterno in meno. Non sono sicuro della portabilità però. Potrebbe essere un bash-ism .. ;-)
Oscar

0

Questa è probabilmente la risposta più semplice che risponde direttamente alla domanda. prova quanto segue:

touch file-1 file-2 file-3

Diciamo che vogliamo aprire (o modificare) il secondo file, possiamo fare quanto segue:

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

questo produrrà il nome del secondo file, che possiamo usare come input per il comando che vogliamo eseguire, ad esempio:

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

produrrà il contenuto del secondo file.

si noti che è possibile modificare l'ordine in cui i file vengono stampati da ls, modificando gli argomenti ls, vedere man lsper i dettagli.

[AGGIORNAMENTO] ciò presuppone che non ci siano spazi bianchi nei nomi dei file,
grazie @wjandrea per la tua osservazione.


2
Ciò fallirà per i nomi di file che contengono spazi. Questa risposta la evita, ma è ancora una cattiva idea da analizzare ls. Anche i backtick sono obsoleti. Usa $()invece.
wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.