¿Es posible abrir un archivo desde el terminal no por su nombre sino por su posición (número) en la carpeta? ¿O alguna otra opción?
Porque el nombre es demasiado largo.
Tab
tecla?
¿Es posible abrir un archivo desde el terminal no por su nombre sino por su posición (número) en la carpeta? ¿O alguna otra opción?
Porque el nombre es demasiado largo.
Tab
tecla?
Respuestas:
Probablemente aún no haya descubierto la Tabfinalización (ver aquí ).
Mientras escribe un nombre de archivo en la Terminal, simplemente escriba las primeras letras y presione Taby vea magia.
*
, si no desea utilizar la finalización de tabulación por algún motivo. O incluso *abc*
si el nombre de archivo contiene abc
algún lugar (intente usar un subpatrón que sea único para el nombre de archivo que desee). O simplemente copie / pegue el nombre del archivo con el mouse.
Solo por diversión, literalmente respondiendo la pregunta:
#!/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]])
El contenido del directorio actual está listado, numerado. Elija el número y se abrirá el artículo:
...es fácil:
Cierre sesión y vuelva a iniciarla y comience a usar el comando simplemente escribiendo
$ o
en terminal
Si también desea mostrar archivos ocultos, cambie
show_hidden = False
dentro:
show_hidden = True
~/bin
no está ya en su PATH, tendrá que añadirlo (por ejemplo, poner una línea como export PATH="$PATH:~/bin"
en .bashrc
o .profile
.)
source ~/.profile
.
~/bin
no está integrado en nada en absoluto. Ubuntu y Debian se envían con una costumbre ~/.profile
que tiene líneas if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi
. En Mac OS X y CentOS, debe configurarlo usted mismo. Una buena posibilidad es que si Ubuntu es proporcionado a una persona por el departamento de TI, es probable ~/.profile
que no sea lo mismo que Ubuntu predeterminado, por lo que es una buena práctica tener siempre en cuenta que ~/bin
no es estándar. Bash también puede ignorar ~/.profile
si inicia el shell con la --no-profile
opción
Hay una característica poco conocida en Bash que le permite hacer esto sin recurrir a Python o cualquier otra herramienta de terceros, y con una sola línea:
select file in *; do open "$file"; break; done
open
sin embargo, normalmente no funcionará (a menos que esté en Mac OS); xdg-open
probablemente hará el truco en la mayoría de los sistemas GNU / Linux.
En puro bash, usando la select
declaración:
PS3='Quick, quick, give a number: '
select file in *
do
xdg-open "$file"
break
done
Configurar PS3 es simplemente llamativo. Si lo deja fuera, solo obtendrá el mensaje predeterminado. Si omite la instrucción break, la instrucción select se repetirá hasta que presione CTRL-D o CTRL-C.
Por supuesto, también puede ejecutarlo como una línea:
select file in *; do xdg-open "$file"; break; done
Puede instalar y usar mc
Midnight Commander. Es una interfaz de usuario de texto con menús, etc., inspirada en el antiguo Norton Commander, que era popular cuando la gente usaba MSDOS (antes de Windows).
sudo apt update
sudo apt install mc
e iniciarlo en una ventana de terminal o en una pantalla de texto,
mc
$ ls
results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh
Que tal si
ls | sed -n 3p
Imprime el tercer nombre de archivo
Templates
Abrelo-
xdg-open "$(ls | sed -n 3p)"
Por lo general funciona.
Ponlo en un script
#!/bin/bash
xdg-open "$(ls | sed -n "$1"p)"
Nombre del script: abierto
Guárdelo en la carpeta de inicio. Correr:
./open file_number
En los sistemas de archivos de Linux, los nombres de archivo tienen una propiedad muy interesante llamada inodo : un directorio (o carpeta) es una lista de inodes y qué nombres de archivo apuntan a esos inodes. Entonces, si conoce el número de inodo, puede intentar localizar el archivo usando la find
utilidad y realizar ciertas operaciones en él. Esto es especialmente útil cuando se trata de nombres de archivos en diferentes configuraciones regionales, caracteres especiales o cuando crea accidentalmente un directorio llamado~
.
Por ejemplo,
$ 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
Lo que esto hace es atravesar el directorio de trabajo actual (representado por .
) y buscar la entrada del directorio que es un archivo con el número de inodo 1103743. Si se encuentra el archivo, xdg-open
se abrirá el archivo con la aplicación predeterminada y se find
cerrará después. La razón para el extra -and
y -quit
es para evitar xdg-open
volver a abrir el archivo si existen enlaces duros del archivo (que es equivalente a abrir el mismo archivo dos veces).
Crea algunos archivos:
$ 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.
Coloque los archivos en una variable y abra el archivo por un índice.
$ files=(*)
$ xdg-open "${files[12]}"
# Opens 12.txt in a text editor, which reads "This is file 12."
Reemplace 12
con el índice que está intentando abrir.
Esta es probablemente la respuesta más simple que responde directamente a la pregunta. prueba lo siguiente:
touch file-1 file-2 file-3
Digamos que queremos abrir (o editar) el segundo archivo, podemos hacer lo siguiente:
echo `ls` | cut -d' ' -f2
esto generará el nombre del segundo archivo, que podemos usar como entrada para el comando que queremos realizar, por ejemplo:
cat $( echo `ls` | cut -d' ' -f2 )
generará el contenido del segundo archivo.
tenga en cuenta que puede cambiar el orden en que ls imprime los archivos, ajustando los argumentos de ls, consulte los
man ls
detalles.
[ACTUALIZACIÓN] esto supone que no tiene espacios en blanco en los nombres de archivo,
gracias @wjandrea por su observación.
ls
. También los backticks están en desuso. Usar en su $()
lugar.