É 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.
Tab
tecla?
É 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.
Tab
tecla?
Respostas:
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!
*
, se você não quiser usar o preenchimento de tabulação por algum motivo. Ou mesmo *abc*
que o nome do arquivo contenha abc
algum 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.
Apenas por diversão, literalmente respondendo à pergunta:
#!/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]])
O conteúdo do diretório atual é listado, numerado. Escolha o número e o item é aberto:
...é fácil:
Efetue logout e logon novamente e comece a usar o comando digitando apenas
$ o
no terminal
Se você deseja mostrar também arquivos ocultos, altere
show_hidden = False
para dentro:
show_hidden = True
~/bin
ainda não estiver no seu PATH, será necessário adicioná-lo (por exemplo, colocar uma linha como export PATH="$PATH:~/bin"
em .bashrc
ou .profile
.)
source ~/.profile
.
~/bin
não está incorporado em nada. O Ubuntu e o Debian são enviados com um costume ~/.profile
que 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 ~/.profile
não serão as mesmas que o Ubuntu padrão, portanto, é uma boa prática sempre ter cuidado com o que ~/bin
não é padrão. O Bash também pode ignorar ~/.profile
se você iniciar o shell com a --no-profile
opção
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
open
normalmente não funciona (a menos que você esteja no Mac OS); xdg-open
provavelmente fará o truque na maioria dos sistemas GNU / Linux.
No bash puro, usando a select
instruçã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
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
$ ls
results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh
Que tal
ls | sed -n 3p
Imprime o terceiro nome do arquivo
Templates
Abra-
xdg-open "$(ls | sed -n 3p)"
Geralmente funciona.
Coloque em um script
#!/bin/bash
xdg-open "$(ls | sed -n "$1"p)"
Nome do script: aberto
Salve-o na pasta pessoal. Corre:
./open file_number
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 find
utilitá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-open
o arquivo será aberto com o aplicativo padrão e find
será encerrado posteriormente. O motivo do extra -and
e -quit
é evitar a xdg-open
reabertura do arquivo, se existirem links físicos para o arquivo (o que equivale a abrir o mesmo arquivo duas vezes).
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 12
pelo índice que você está tentando abrir.
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 ls
para 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.
ls
. Os backticks também estão obsoletos. Use em $()
vez disso.