É 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.
Tabtecla?
É 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.
Tabtecla?
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 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.
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
~/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.)
source ~/.profile.
~/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
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
opennormalmente não funciona (a menos que você esteja no Mac OS); xdg-openprovavelmente fará o truque na maioria dos sistemas GNU / Linux.
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
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 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).
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.
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.
ls. Os backticks também estão obsoletos. Use em $()vez disso.