Abra un documento desde la terminal, pero no por su nombre.


19

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


55
Por favor, editar y dar un ejemplo de lo que quiere hacer.
postre

77
No, no sin codificarlo. Pero puede usar la finalización de "pestaña".
Rinzwind

2
¿Demasiado tiempo para qué?
Carl Witthoft

2
¿Has intentado escribir las primeras dos o tres letras del nombre del archivo y luego presionas la Tabtecla?
Henrique

Respuestas:


44

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.


77
O simplemente escriba las primeras letras del nombre de archivo y a *, 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.
Guntram Blohm apoya a Monica el

44
@guntram O incluso puede arrastrar y soltar archivos a la Terminal.
pomsky

66
@GuntramBlohm deberías hacer eso una respuesta. Creo que es lo suficientemente diferente de esta respuesta como para sostenerse por sí solo.
DQdlM

32

Solo por diversión, literalmente respondiendo la pregunta:

ingrese la descripción de la imagen aquí

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

Cómo funciona en la práctica

  1. En la terminal, en el directorio de trabajo, ejecute "o" (como comando)
  2. El contenido del directorio actual está listado, numerado. Elija el número y se abrirá el artículo:

    ingrese la descripción de la imagen aquí

Preparar

...es fácil:

  1. Cree, si aún no existe, una carpeta llamada "bin" en su directorio de inicio
  2. Copie el script en un archivo vacío, guárdelo como (literalmente) "o" (sin extensión) y hágalo ejecutable
  3. Cierre sesión y vuelva a iniciarla y comience a usar el comando simplemente escribiendo

    $ o
    

    en terminal

nótese bien

Si también desea mostrar archivos ocultos, cambie

show_hidden = False

dentro:

show_hidden = True

1
Si ~/binno está ya en su PATH, tendrá que añadirlo (por ejemplo, poner una línea como export PATH="$PATH:~/bin"en .bashrco .profile.)
Nick Matteo

Ver la respuesta de b0fh : esto parece ser una función de bash
mgarciaisaia

1
@kundor no, no en Ubuntu. Cerrar sesión y hacer el trabajo, o simplemente source ~/.profile.
Jacob Vlijm

@JacobVlijm ~/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
Sergiy Kolodyazhnyy

@mgarciaisaia El comentario original fue para ti, en realidad ^
Sergiy Kolodyazhnyy

28

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

8
¡Excelente! 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.
Nick Matteo

1
Pero bash no es el único shell que existe, ya sabes :-)
jamesqf

16

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

Una solución lo suficientemente simple y funciona lo suficientemente bien. Puedes ir un paso más allá y crear un alias o una función
Sergiy Kolodyazhnyy

7

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

5

$ 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



3

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


1

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.


Prefiero {00..20} en lugar de $ (seq -w 0 20) porque es solo un proceso externo menos para generar. Sin embargo, no estoy seguro de la portabilidad. Podría ser un bash-ism .. ;-)
Oscar

0

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.


2
Esto fallará para los nombres de archivo que contienen espacios. Esta respuesta evita eso, pero sigue siendo una mala idea analizar ls. También los backticks están en desuso. Usar en su $()lugar.
wjandrea
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.