¿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.
Tabtecla?
¿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.
Tabtecla?
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 abcalgú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
~/binno está ya en su PATH, tendrá que añadirlo (por ejemplo, poner una línea como export PATH="$PATH:~/bin"en .bashrco .profile.)
source ~/.profile.
~/binno está integrado en nada en absoluto. Ubuntu y Debian se envían con una costumbre ~/.profileque 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 ~/.profileque no sea lo mismo que Ubuntu predeterminado, por lo que es una buena práctica tener siempre en cuenta que ~/binno es estándar. Bash también puede ignorar ~/.profilesi inicia el shell con la --no-profileopció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
opensin embargo, normalmente no funcionará (a menos que esté en Mac OS); xdg-openprobablemente hará el truco en la mayoría de los sistemas GNU / Linux.
En puro bash, usando la selectdeclaració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 mcMidnight 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 findutilidad 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-opense abrirá el archivo con la aplicación predeterminada y se findcerrará después. La razón para el extra -andy -quites para evitar xdg-openvolver 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 12con 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 lsdetalles.
[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.