ターミナルからドキュメントを開きますが、名前では開きません


19

ターミナルからファイルを名前ではなくフォルダ内の(番号)位置で開くことはできますか?または他のオプション?

名前が長すぎるからです。


5
喜ば編集をし、あなたが何をしたいの例を与えます。
デザート

7
いいえ、コーディングせずに。ただし、「タブ」補完を使用できます。
リンツウィンド

2
何が長すぎますか?
カールウィットソフト

2
ファイル名の最初の2文字または3文字を入力してからTabキーを押してみましたか?
エンリケ

回答:


44

Tab-completion(ここを参照)をまだ発見していない可能性があります。

ターミナルでファイル名を入力するときに、最初の数文字を入力するだけで、ヒットTabして魔法を見ることができます!


7
または*、何らかの理由でタブ補完を使用したくない場合は、ファイル名の最初の数文字を入力します。または*abc*、ファイル名にabcどこかが含まれている場合でも(必要なファイル名に固有のサブパターンを使用してみてください)。または、マウスを使用してファイル名をコピー/貼り付けします。
Guntram Blohmは

4
@guntramまたは、ファイルをターミナルにドラッグアンドドロップすることもできます。
ポンスキー

6
@GuntramBlohmあなたはそれを答えにする必要があります。単独で立つことは、この答えとは十分に異なると思います。
DQdlM

32

楽しみのために、文字通り質問に答えます:

ここに画像の説明を入力してください

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

実際の仕組み

  1. ターミナルの作業ディレクトリで、「o」を(コマンドとして)実行します
  2. 現在のディレクトリの内容がリストされ、番号が付けられます。番号を選択すると、アイテムが開きます。

    ここに画像の説明を入力してください

セットアップ

...は簡単だ:

  1. ホームディレクトリに「bin」という名前のフォルダがまだ存在しない場合は作成します
  2. スクリプトを空のファイルにコピーし、(文字通り)「o」(拡張子なし)として保存し、実行可能にします
  3. ログアウトしてからログインし直して、コマンドの使用を開始します

    $ o
    

    ターミナル内

NB

隠しファイルも表示したい場合は、変更します

show_hidden = False

に:

show_hidden = True

1
場合は~/bin、あなたのPATHになっていない、あなたはそれを追加する必要があります(のような行を入れて、例えばexport PATH="$PATH:~/bin".bashrc.profile。)
ニック・マッテオ

b0fhの答えをご覧ください-これはbashの組み込みのようです
mgarciaisaia

1
@kundor nope、Ubuntuではありません。ログアウトしてログインするか、または単にsource ~/.profile
ジェイコブヴリム

@JacobVlijm ~/binは何にも組み込まれていません。UbuntuとDebianに~/.profileは、行があるカスタムが付属していますif [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi。Mac OS XおよびCentOSでは、自分で設定する必要があります。IT部門からUbuntuが提供された場合、チャンスは~/.profileデフォルトのUbuntuと同じではないため、常に~/bin標準ではないことに注意することをお勧めします。オプションで~/.profileシェルを起動した場合、Bashは無視することもでき--no-profileます
Sergiy Kolodyazhnyy

@mgarciaisaia元のコメントは実際にあなたのためのものでした^^
Sergiy Kolodyazhnyy

28

Bashには、Pythonや他のサードパーティツールを呼び出さずに1行でこれを実行できる、あまり知られていない機能があります。

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

8
優れた!openただし、通常は動作しません(Mac OSを使用している場合を除く)。xdg-openほとんどのGNU / Linuxシステムでおそらくこのトリックを行うでしょう。
ニックマッテオ

1
しかし、bashは存在する唯一のシェルではありません、あなたは知っています:-)
jamesqf

16

純粋なbashでは、次のselectステートメントを使用します。

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

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

PS3の設定は見た目だけです。省略した場合、デフォルトのプロンプトが表示されます。breakステートメントを省略すると、CTRL-DまたはCTRL-Cを押すまでselectステートメントがループします。

もちろん、ワンライナーとして実行することもできます:

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

十分にシンプルなソリューションであり、十分に機能します。さらに一歩進んで、エイリアスまたは関数を作成することができます
Sergiy Kolodyazhnyy

7

mcMidnight Commanderをインストールして使用できます。これは、古いノートンコマンダーに触発されたメニューなどを備えたテキストユーザーインターフェイスであり、Windowsの前にMSDOSを使用したときに人気がありました。

sudo apt update
sudo apt install mc

ターミナルウィンドウまたはテキスト画面で起動します。

mc

5

$ ls

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

どのように試合

ls | sed -n 3p

プリント第三のファイル名

Templates

それを開く-

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

通常は機能します。

スクリプトに入れる

#!/bin/bash

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

スクリプトの名前:open

ホームフォルダーに保存します。実行:

./open file_number



3

Linuxファイルシステムでは、ファイル名にはiノードと呼ばれる非常に興味深いプロパティがあります。ディレクトリ(またはフォルダ)はiノードのリストであり、どのファイル名がそれらのiノードを指します。したがって、inode番号がわかっている場合は、findutility を使用してファイルを見つけ、特定の操作を実行できます。これは、異なるロケールのファイル名、特殊文字を処理する場合~、またはというディレクトリを誤って作成した場合に特に便利です。

例えば、

$ 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

これは、現在の作業ディレクトリ(で表される.)を走査し、inode番号1103743のファイルであるディレクトリエントリを探します。ファイルが見つかった場合、xdg-openデフォルトのアプリケーションでファイルを開き、findその後終了します。余分な理由-andとは、-quit予防することであるxdg-open(2回同じファイルを開くと等価である)ファイルへのハードリンクが存在する場合、ファイルを再度開きます。


1

いくつかのファイルを作成します。

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

ファイルを変数に入れ、インデックスによってファイルを開きます。

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

12開こうとしているインデックスに置き換えます。


$(seq -w 0 20)の代わりに{00..20}を好むのは、生成する外部プロセスが1つ少ないためです。ただし、移植性についてはわかりません。bash-ismかもしれません。;-)
オスカー

0

これはおそらく、質問に直接答える最も簡単な答えです。以下を試してください:

touch file-1 file-2 file-3

2番目のファイルを開く(または編集する)場合、次のようにします。

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

これにより、2番目のファイルの名前が出力されます。これは、実行するコマンドへの入力として使用できます。次に例を示します。

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

2番目のファイルのコンテンツを出力します。

ls引数を調整することにより、lsがファイルを出力する順序を変更できることに注意しman lsてください。詳細については、を参照してください。

[更新]これは、ファイル名に空白が含まれていないことを前提としてい
ます。観察のために@wjandrea に感謝します。


2
This will fail for filenames that contain spaces. This answer gets around that, but it's still a bad idea to parse ls. Also backticks are deprecated. Use $() instead.
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.