È 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.
Tab
tasto?
È 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.
Tab
tasto?
Risposte:
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!
*
, se non vuoi usare il completamento con Tab per qualche motivo. O anche *abc*
se il nome file contiene abc
da qualche parte (prova a utilizzare un sottotatro unico per il nome file desiderato). O semplicemente copia / incolla il nome del file usando il mouse.
Solo per divertimento, rispondendo letteralmente alla domanda:
#!/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]])
Il contenuto della directory corrente è elencato, numerato. Scegli il numero e l'oggetto viene aperto:
...è facile:
Disconnettersi e riconnettersi e iniziare a utilizzare il comando semplicemente digitando
$ o
nel terminale
Se desideri mostrare anche i file nascosti, modifica
show_hidden = False
in:
show_hidden = True
~/bin
non è già nel tuo PERCORSO, dovrai aggiungerlo (ad esempio, inserendo una linea come export PATH="$PATH:~/bin"
in .bashrc
o .profile
.)
source ~/.profile
.
~/bin
non è integrato in nulla. Ubuntu e Debian vengono forniti con ~/.profile
linee 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 ~/.profile
che non sarà lo stesso di Ubuntu predefinito, quindi è una buona pratica fare sempre attenzione che ~/bin
non sia standard. Bash può anche ignorare ~/.profile
se --no-profile
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
open
in genere non funzionerà, tuttavia (a meno che tu non sia su Mac OS); xdg-open
probabilmente farà il trucco sulla maggior parte dei sistemi GNU / Linux.
In puro bash, usando l' select
affermazione:
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
È possibile installare e utilizzare mc
Midnight 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
$ 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
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' find
utility 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-open
aprirà il file con l'applicazione predefinita e find
verrà chiuso in seguito. La ragione per l'extra -and
ed -quit
è quello di impedire xdg-open
la riapertura del file se esistono collegamenti fisici al file (che equivale ad aprire lo stesso file due volte).
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 12
con l'indice che stai tentando di aprire.
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 ls
per i dettagli.
[AGGIORNAMENTO] ciò presuppone che non ci siano spazi bianchi nei nomi dei file,
grazie @wjandrea per la tua osservazione.
ls
. Anche i backtick sono obsoleti. Usa $()
invece.