Terminalden bir doküman açın, ancak adıyla değil


19

Terminalden bir dosyayı adıyla değil klasördeki (sayı) konumu ile açmak mümkün müdür? Veya başka bir seçenek?

Çünkü isim çok uzun.


5
Lütfen ne yapmak istediğinizi düzenleyin ve bir örnek verin.
tatlı

7
Hayır, kodlamadan değil. Ancak "sekme" tamamlamasını kullanabilirsiniz.
Rinzwind

2
Ne için çok uzun?
Carl Witthoft

2
Dosya adının ilk iki veya üç harfini yazmayı ve ardından Tabtuşuna basmayı denediniz mi?
Henrique

Yanıtlar:


44

Muhtemelen henüz- Tabtamamlama ( burada bakınız ) keşfetmediniz .

Terminal'e bir dosya adı yazarken sadece ilk birkaç harfi yazın ve Tabbüyüyü görün ve görün!


7
Veya dosya adının ilk birkaç harfini yazın ve a *, herhangi bir nedenle Sekme-tamamlamayı kullanmak istemiyorsanız. Veya *abc*dosya adı bir abcyerde olsa bile (istediğiniz dosya adına özgü bir alt desen kullanmaya çalışın). Veya sadece fareyi kullanarak dosya adını kopyalayın / yapıştırın.
Guntram Blohm, Monica

4
@guntram Ya da dosyaları Terminal'e sürükleyip bırakabilirsiniz.
Mart'ta pomsky

6
@GuntramBlohm buna bir cevap vermelisin. Kendi başına ayakta durmanın bu cevaptan yeterince farklı olduğunu düşünüyorum.
DQdlM

32

Sadece eğlence için, soruyu tam anlamıyla cevaplıyoruz:

resim açıklamasını buraya girin

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

Pratikte nasıl çalışır?

  1. Terminalde, çalışma dizininde "o" komutunu çalıştırın (komut olarak)
  2. Geçerli dizinin içeriği numaralandırılmış olarak listelenir. Numarayı seçtiğinizde öğe açılır:

    resim açıklamasını buraya girin

Kurmak

...kolay:

  1. Henüz yoksa, ana dizininizde "bin" adlı bir klasör oluşturun
  2. Komut dosyasını boş bir dosyaya kopyalayın, (tam anlamıyla) "o" (uzantı yok) olarak kaydedin ve yürütülebilir yapın
  3. Oturumu kapatıp tekrar açın ve sadece yazarak komutu kullanmaya başlayın

    $ o
    

    terminalde

NB

Gizli dosyaları da göstermek istiyorsanız, değiştirin

show_hidden = False

içine:

show_hidden = True

1
~/binZaten PATH'nizde değilse , eklemeniz gerekir (örneğin, export PATH="$PATH:~/bin"içine .bashrcveya benzeri bir çizgi koymak .profile)
Nick Matteo

B0fh'nin cevabına bakın - bu bash'tan bir yerleşik gibi görünüyor
mgarciaisaia

1
@kundor nope, Ubuntu'da değil. Oturumu kapatın ve işi yapın ya da basitçe yapın source ~/.profile.
Jacob Vlijm

@JacobVlijm ~/binhiçbir şeye dahil değildir. Ubuntu ve Debian ~/.profile, hatları olan özellerle gönderilir if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi. Mac OS X ve CentOS'ta bunu kendiniz yapılandırmanız gerekir. İyi bir şans, eğer Ubuntu bir kişiye BT departmanı tarafından sağlanırsa, şansın ~/.profilevarsayılan Ubuntu ile aynı olmayacağıdır, bu nedenle ~/binstandart olmayan her zaman dikkat etmek iyi bir uygulamadır . Bash seçeneği ~/.profileile kabuğu başlatırsanız görmezden gelebilirsiniz--no-profile
Sergiy Kolodyazhnyy

@mgarciaisaia Orijinal yorum sizin için, aslında ^
Sergiy Kolodyazhnyy

28

Bash'te, python veya başka bir üçüncü taraf aracı çağırmadan ve tek bir hatla bunu yapmanıza izin veren az bilinen bir özellik vardır:

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

8
Mükemmel! opengenellikle (Mac OS'de değilseniz) çalışmaz; xdg-openmuhtemelen çoğu GNU / Linux sisteminde hile yapacak.
Nick Matteo

1
Ama bash var olan tek kabuk değil, biliyorsun :-)
jamesqf

16

Saf bash selectifadesini kullanarak :

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

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

PS3'ü ayarlamak sadece göz alıcı. Dışarıda bırakırsanız, varsayılan istemi alırsınız. Break deyimini dışarıda bırakırsanız, select deyimi CTRL-D veya CTRL-C tuşlarına basıncaya kadar döngü yapar.

Tabii ki tek katmanlı olarak da çalıştırabilirsiniz:

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

Bir çözüm yeterince basit ve yeterince iyi çalışıyor. Bir adım daha ileri gidebilir ve bir takma ad oluşturabilir veya işlevini yerine getirebilirsiniz
Sergiy Kolodyazhnyy

7

mcMidnight Commander'i kurabilir ve kullanabilirsiniz . Eski Norton Commander'dan esinlenen, kullanıcılar MSDOS (Windows'tan önce) kullandığında popüler olan menüler vb. İçeren bir metin kullanıcı arabirimidir.

sudo apt update
sudo apt install mc

ve bir terminal penceresinde veya bir metin ekranında başlatın,

mc

5

$ ls

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

Nasıl olur

ls | sed -n 3p

3. dosya adını yazdırır

Templates

Aç onu-

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

Genellikle çalışır.

Bir senaryoya koy

#!/bin/bash

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

Komut dosyasının adı: açık

Ana klasöre kaydedin. Çalıştırmak:

./open file_number



3

Linux dosya sistemlerinde, dosya adlarının inode adı verilen çok ilginç bir özelliği vardır : bir dizin (veya klasör) inode'ların listesidir ve dosya adları bu inode'ları gösterir. Bu nedenle, inode numarasını biliyorsanız, findyardımcı programı kullanarak dosyayı bulmayı ve üzerinde belirli işlemleri gerçekleştirmeyi deneyebilirsiniz . Bu, özellikle farklı yerel ayarlarda, özel karakterlerde dosya adları ile uğraşırken veya yanlışlıkla adlandırılan dizin oluşturduğunuzda~ yararlıdır .

Örneğin,

$ 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

Bunun yaptığı, geçerli çalışma dizinini (ile temsil edilen .) çevirmek ve 1103743 inode numaralı bir dosya olan dizin girişini aramaktır. Dosya bulunursa, xdg-opendosyayı varsayılan uygulama ile açar ve sonra kapanır find. Ekstra nedeni -andve -quitönlemektir xdg-open(iki kez aynı dosyayı açarak eşdeğerdir) dosyasına sabit bağlantıları mevcut ise dosyayı yeniden açmayı.


1

Bazı dosyalar oluşturun:

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

Dosyaları bir değişkene koyun ve dosyayı bir dizinle açın.

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

12Açmaya çalıştığınız dizinle değiştirin .


$ (Seq -w 0 20) yerine {00..20} 'i tercih ederim. Taşınabilirlik konusunda emin değilim. Bir bash-ism olabilir .. ;-)
Oscar

0

Bu muhtemelen soruyu doğrudan cevaplayan en basit cevaptır. takip etmeyi dene:

touch file-1 file-2 file-3

Diyelim ki ikinci dosyayı açmak (veya düzenlemek) istiyoruz, şunları yapabiliriz:

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

bu, gerçekleştirmek istediğimiz komuta girdi olarak kullanabileceğimiz ikinci dosyanın adını verir, örneğin:

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

ikinci dosyanın içeriğini çıktılar.

ls argümanlarını değiştirerek dosyaların ls tarafından yazdırılma sırasını değiştirebileceğinizi unutmayın, man lsayrıntılar için bkz .

[GÜNCELLEME] dosya adlarında boşluk olmadığınızı varsayar,
gözleminiz için @wjandrea teşekkürler.


2
Bu, boşluk içeren dosya adları için başarısız olur. Bu cevap bu sorunu çözüyor, ancak ayrıştırma hala kötü bir fikir ls. Ayrıca geri tepmeler kullanımdan kaldırılmıştır. $()Bunun yerine kullanın .
wjandrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.