Abra um documento do terminal, mas não pelo nome


19

É possível abrir um arquivo do terminal não pelo nome, mas pela posição (número) na pasta? Ou alguma outra opção?

Porque o nome é muito longo.


5
Por favor, editar e dar um exemplo do que você quer fazer.
dessert

7
Não, não sem codificá-lo. Mas você pode usar a conclusão "tab".
Rinzwind 22/03

2
Muito tempo para o que?
Carl Witthoft em 22/03

2
Você tentou digitar as duas ou três primeiras letras do nome do arquivo e depois pressionou a Tabtecla?
Henrique

Respostas:


44

Você provavelmente ainda não descobriu a Tabconclusão (veja aqui ) ainda.

Ao digitar um nome de arquivo no Terminal, basta digitar as primeiras letras e clicar Tabe ver a mágica!


7
Ou apenas digite as primeiras letras do nome do arquivo e a *, se você não quiser usar o preenchimento de tabulação por algum motivo. Ou mesmo *abc*que o nome do arquivo contenha abcalgum lugar (tente usar um subpadrão exclusivo do nome do arquivo que você deseja). Ou simplesmente copie / cole o nome do arquivo usando o mouse.
Guntram Blohm apoia Monica

4
@ guntram Ou você pode até arrastar e soltar arquivos no Terminal.
pomsky 22/03

6
@GuntramBlohm, você deve fazer disso uma resposta. Eu acho que é suficientemente diferente desta resposta para se sustentar por si só.
DQdlM 22/03

32

Apenas por diversão, literalmente respondendo à pergunta:

insira a descrição da imagem aqui

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

Como funciona na prática

  1. No terminal, no diretório de trabalho, execute "o" (como um comando)
  2. O conteúdo do diretório atual é listado, numerado. Escolha o número e o item é aberto:

    insira a descrição da imagem aqui

Configuração

...é fácil:

  1. Crie, se ainda não existir, uma pasta chamada "bin" no seu diretório pessoal
  2. Copie o script em um arquivo vazio, salve-o como (literalmente) "o" (sem extensão) e torne-o executável
  3. Efetue logout e logon novamente e comece a usar o comando digitando apenas

    $ o
    

    no terminal

NB

Se você deseja mostrar também arquivos ocultos, altere

show_hidden = False

para dentro:

show_hidden = True

1
Se ~/binainda não estiver no seu PATH, será necessário adicioná-lo (por exemplo, colocar uma linha como export PATH="$PATH:~/bin"em .bashrcou .profile.)
Nick Matteo

Veja a resposta do b0fh - este parece ser um
recurso

1
@kundor não, não no Ubuntu. Saia e faça o trabalho, ou simplesmente source ~/.profile.
Jacob Vlijm 22/03

@JacobVlijm ~/binnão está incorporado em nada. O Ubuntu e o Debian são enviados com um costume ~/.profileque possui linhas if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. No Mac OS X e CentOS, você deve configurar isso sozinho. Uma boa chance é que, se o Ubuntu for fornecido a uma pessoa pelo departamento de TI, as chances ~/.profilenão serão as mesmas que o Ubuntu padrão, portanto, é uma boa prática sempre ter cuidado com o que ~/binnão é padrão. O Bash também pode ignorar ~/.profilese você iniciar o shell com a --no-profileopção
Sergiy Kolodyazhnyy

@mgarciaisaia Comentário original foi feito para você, na verdade ^
Sergiy Kolodyazhnyy 23/03

28

Há um recurso pouco conhecido no Bash que permite fazer isso sem chamar o python ou qualquer outra ferramenta de terceiros e com uma única linha:

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

8
Excelente! opennormalmente não funciona (a menos que você esteja no Mac OS); xdg-openprovavelmente fará o truque na maioria dos sistemas GNU / Linux.
Nick Matteo

1
Mas bash não é o único shell existente, você sabe :-)
jamesqf

16

No bash puro, usando a selectinstrução:

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

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

A configuração do PS3 é apenas uma delícia. Se você deixar de fora, você receberá o prompt padrão. Se você deixar de fora a instrução de interrupção, a instrução de seleção fará um loop até você pressionar CTRL-D ou CTRL-C.

Claro que você também pode executá-lo como uma linha:

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

Simples o suficiente de uma solução e funciona bem o suficiente. Você pode dar um passo adiante e criar um apelido ou função a partir dele
Sergiy Kolodyazhnyy 23/03

7

Você pode instalar e usar mc, Midnight Commander. É uma interface de usuário de texto com menus, etc., inspirada no antigo Norton Commander, popular quando as pessoas usavam o MSDOS (antes do Windows).

sudo apt update
sudo apt install mc

e inicie-o em uma janela do terminal ou em uma tela de texto,

mc


3

Nos sistemas de arquivos Linux, os nomes de arquivos têm uma propriedade muito interessante chamada inode : um diretório (ou pasta) é uma lista de inodes e quais nomes de arquivos apontam para esses inodes. Portanto, se você souber o número do inode, poderá tentar localizar o arquivo usando o findutilitário e executar determinadas operações nele. Isso é especialmente útil ao lidar com nomes de arquivos em códigos de idioma diferentes, caracteres especiais ou quando você criou acidentalmente um diretório chamado~ .

Por exemplo,

$ 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

O que isso faz é atravessar o diretório de trabalho atual (representado por .) e procurar a entrada de diretório que é um arquivo com o número de inode 1103743. Se o arquivo for encontrado, xdg-openo arquivo será aberto com o aplicativo padrão e findserá encerrado posteriormente. O motivo do extra -ande -quité evitar a xdg-openreabertura do arquivo, se existirem links físicos para o arquivo (o que equivale a abrir o mesmo arquivo duas vezes).


1

Faça alguns arquivos:

$ 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 os arquivos em uma variável e abra o arquivo por um índice.

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

Substitua 12pelo índice que você está tentando abrir.


Eu prefiro {00..20} em vez de $ (seq -w 0 20) porque é apenas um processo externo a ser gerado. Não tenho certeza sobre portabilidade. Pode ser um bash-ism .. ;-)
Oscar

0

Esta é provavelmente a resposta mais simples que responde diretamente à pergunta. tente o seguinte:

touch file-1 file-2 file-3

Digamos que queremos abrir (ou editar) o segundo arquivo, podemos fazer o seguinte:

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

isso produzirá o nome do segundo arquivo, que podemos usar como entrada para o comando que queremos executar, por exemplo:

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

produzirá o conteúdo do segundo arquivo.

observe que você pode alterar a ordem em que os arquivos são impressos por ls, ajustando os argumentos de ls, man lspara obter detalhes.

[UPDATE] supõe que você não tenha espaços em branco nos nomes dos arquivos.
Agradecemos a @wjandrea por sua observação.


2
Isso falhará nos nomes de arquivos que contêm espaços. Essa resposta contorna isso, mas ainda é uma má ideia analisar ls. Os backticks também estão obsoletos. Use em $()vez disso.
wjandrea 24/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.