web-dev-qa-db-ja.com

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

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

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

19
yh yeah

あなたはおそらく発見していません Tab-完了( ここ を参照)。

ターミナルでファイル名を入力するときは、最初の数文字を入力して、 Tab そして魔法を見てください!

44
pomsky

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

enter image description here

#!/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. 現在のディレクトリの内容がリストされ、番号が付けられます。番号を選択すると、アイテムが開かれます。

    enter image description here

セットアップ

...は簡単だ:

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

    $ o
    

    ターミナルで

N.B.

隠しファイルも表示したい場合は、

show_hidden = False

に:

show_hidden = True
32
Jacob Vlijm

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

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

純粋な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
16
Oscar

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

Sudo apt update
Sudo apt install mc

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

mc
7
sudodus

_$ ls_

_results.log
string
Templates
textfile
time
time.save
vegetables
vegetablesbsh
_

どのように試合

_ls | sed -n 3p_

印刷rdファイル名

Templates

それを開く-

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

通常は機能します。

スクリプトに入れます

_#!/bin/bash

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

_

スクリプトの名前:オープン

ホームフォルダに保存してください。実行:

_./open file_number
_
5
measSelf

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

例えば、

$ 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

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

3

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

$ 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開こうとしているインデックス。

1
user1717828

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

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のご理解に感謝いたします。

0
user937391