Ouvrez un document depuis le terminal, mais pas par son nom

19

Est-il possible d'ouvrir un fichier à partir du terminal non pas par son nom mais par sa position (numéro) dans le dossier? Ou toute autre option?

Parce que le nom est trop long.

ouais ouais
la source
5
Veuillez modifier et donner un exemple de ce que vous voulez faire.
dessert
7
Non, non sans le coder. Mais vous pouvez utiliser la complétion "tab".
Rinzwind
2
Trop longtemps pour quoi?
Carl Witthoft
2
Avez-vous essayé de taper les deux ou trois premières lettres du nom de fichier, puis d'appuyer sur la Tabtouche?
Henrique

Réponses:

44

Vous n'avez probablement pas encore découvert Tab-achèvement (voir ici ).

En tapant un nom de fichier dans Terminal, tapez simplement les premières lettres et frappez Tabet voyez la magie!

pomsky
la source
7
Ou tapez simplement les premières lettres du nom de fichier, et un *, si vous ne voulez pas utiliser la complétion de tabulation pour une raison quelconque. Ou même *abc*si le nom de fichier contient abcquelque part (essayez d'utiliser un sous-modèle unique au nom de fichier que vous souhaitez). Ou copiez / collez simplement le nom de fichier à l'aide de la souris.
Guntram Blohm prend en charge Monica
4
@guntram Ou vous pouvez même faire glisser et déposer des fichiers sur Terminal.
pomsky
6
@GuntramBlohm, vous devriez en faire une réponse. Je pense qu'elle est suffisamment différente de cette réponse pour être autonome.
DQdlM
32

Juste pour le plaisir, répondant littéralement à la question:

entrez la description de l'image ici

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

Comment ça marche dans la pratique

  1. Dans le terminal, dans le répertoire de travail, exécutez "o" (comme une commande)
  2. Le contenu du répertoire actuel est répertorié, numéroté. Choisissez le numéro et l'article est ouvert:

    entrez la description de l'image ici

Installer

...est facile:

  1. Créez, s'il n'existe pas encore, un dossier nommé "bin" dans votre répertoire personnel
  2. Copiez le script dans un fichier vide, enregistrez-le sous (littéralement) "o" (sans extension) et rendez-le exécutable
  3. Déconnectez-vous et reconnectez-vous et commencez à utiliser la commande en tapant simplement

    $ o
    

    dans le terminal

NB

Si vous souhaitez également afficher les fichiers masqués, modifiez

show_hidden = False

dans:

show_hidden = True
Jacob Vlijm
la source
1
S'il ~/binn'est pas déjà dans votre PATH, vous devrez l'ajouter (par exemple, en mettant une ligne comme export PATH="$PATH:~/bin"dans .bashrcou .profile.)
Nick Matteo
Voir la réponse de b0fh - cela semble être une fonction intégrée de bash
mgarciaisaia
1
@kundor non, pas sur Ubuntu. Se déconnecter et se connecter fait le travail, ou tout simplement source ~/.profile.
Jacob Vlijm
@JacobVlijm ~/binn'est intégré à rien du tout. Ubuntu et Debian sont livrés avec une coutume ~/.profilequi a des lignes if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. Sur Mac OS X et CentOS, vous devez le configurer vous-même. Une bonne chance est que si Ubuntu est fourni à une personne par le service informatique, il y a de fortes chances que ce ~/.profilene soit pas le même que Ubuntu par défaut, c'est donc une bonne pratique de toujours se méfier de ce qui ~/binn'est pas standard. Bash peut également ignorer ~/.profilesi vous lancez le shell avec --no-profileoption
Sergiy Kolodyazhnyy
@mgarciaisaia Le commentaire original était fait pour vous, en fait ^
Sergiy Kolodyazhnyy
28

Il existe une fonctionnalité peu connue dans Bash qui vous permet de le faire sans faire appel à python ou tout autre outil tiers, et avec une seule ligne:

select file in *; do open "$file"; break; done
b0fh
la source
8
Excellent! openne fonctionne généralement pas, cependant (sauf si vous êtes sous Mac OS); xdg-openfera probablement l'affaire sur la plupart des systèmes GNU / Linux.
Nick Matteo
1
Mais bash n'est pas le seul shell existant, vous savez :-)
jamesqf
16

En pur bash, en utilisant l' selectinstruction:

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

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

La configuration de la PS3 est tout simplement épatante. Si vous l'omettez, vous obtiendrez simplement l'invite par défaut. Si vous omettez l'instruction break, l'instruction select sera mise en boucle jusqu'à ce que vous appuyiez sur CTRL-D ou CTRL-C.

Bien sûr, vous pouvez également l'exécuter en une seule ligne:

select file in *; do xdg-open "$file"; break; done
oscar
la source
Assez simple d'une solution et fonctionne assez bien. Vous pouvez aller plus loin et en faire un alias ou une fonction
Sergiy Kolodyazhnyy
7

Vous pouvez installer et utiliser mcMidnight Commander. Il s'agit d'une interface utilisateur textuelle avec des menus, etc. inspirée de l'ancien Norton Commander, qui était populaire lorsque les gens utilisaient MSDOS (avant Windows).

sudo apt update
sudo apt install mc

et le démarrer dans une fenêtre de terminal ou dans un écran de texte,

mc
sudodus
la source
5

$ ls

results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh

Comment combat

ls | sed -n 3p

Imprime le troisième nom de fichier

Templates

Ouvrez-le

xdg-open "$(ls | sed -n 3p)"

Fonctionne généralement.

Mettez-le dans un script

#!/bin/bash

xdg-open "$(ls | sed -n "$1"p)"

Nom du script: ouvert

Enregistrez-le dans le dossier d'accueil. Courir:

./open file_number
2 tours
la source
3

Sur les systèmes de fichiers Linux, les noms de fichiers ont une propriété très intéressante appelée inode : un répertoire (ou dossier) est une liste d'inodes et quels noms de fichiers pointent vers ces inodes. Donc, si vous connaissez le numéro d'inode, vous pouvez essayer de localiser le fichier à l'aide de l' findutilitaire et effectuer certaines opérations dessus. Cela est particulièrement utile lorsque vous traitez des noms de fichiers dans des paramètres régionaux différents, des caractères spéciaux ou lorsque vous avez créé accidentellement un répertoire appelé~ .

Par exemple,

$ 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

Cela permet de parcourir le répertoire de travail actuel (représenté par .) et de rechercher l'entrée de répertoire qui est un fichier avec le numéro d'inode 1103743. Si le fichier est trouvé, xdg-openouvrira le fichier avec l'application par défaut et findquittera ensuite. La raison de la supplémentaire -andet -quitest d'empêcher la xdg-openréouverture du fichier s'il existe des liens durs vers le fichier ( ce qui équivaut à ouvrir le même fichier deux fois).

Sergiy Kolodyazhnyy
la source
1

Créez des fichiers:

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

Mettez les fichiers dans une variable et ouvrez le fichier par un index.

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

Remplacez 12par l'index que vous essayez d'ouvrir.

user1717828
la source
Je préfère {00..20} au lieu de $ (seq -w 0 20) car c'est juste un processus externe de moins à générer. Je ne suis pas sûr de la portabilité. Cela pourrait être un bashisme. ;-)
Oscar
0

C'est probablement la réponse la plus simple qui répond directement à la question. essayez ce qui suit:

touch file-1 file-2 file-3

Disons que nous voulons ouvrir (ou éditer) le deuxième fichier, nous pouvons faire ce qui suit:

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

cela affichera le nom du deuxième fichier, que nous pouvons utiliser comme entrée pour la commande que nous voulons effectuer, par exemple:

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

affichera le contenu du deuxième fichier.

notez que vous pouvez changer l'ordre dans lequel les fichiers sont imprimés par ls, en modifiant les arguments ls, voir man lspour plus de détails.

[MISE À JOUR] cela suppose que vous n'avez pas d'espaces blancs dans les noms de fichiers,
merci @wjandrea pour votre observation.


la source
2
Cela échouera pour les noms de fichiers contenant des espaces. Cette réponse contourne cela, mais c'est toujours une mauvaise idée d'analyser ls. Les backticks sont également déconseillés. Utilisez $()plutôt.
wjandrea