从终端打开文档,但不按其名称打开


19

是否可以通过终端打开文件,而不是通过文件名而是通过文件夹中的(数字)位置打开文件?还是其他选择?

因为名称太长。


5
编辑并举例说明您想做什么。
甜点

7
不,不是没有编码。但是您可以使用“制表符”完成。
Rinzwind

2
太久了?
卡尔·威索夫特

2
您是否尝试过键入文件名的前两个或三个字母,然后Tab按键?
Henrique

Answers:


44

您可能尚未发现Tab-completion(请参阅此处)。

在终端中输入文件名时,只需输入前几个字母并点击即可Tab看到魔术!


7
或者*,如果您出于某种原因不想使用制表符补全,则只需键入文件名的前几个字母和一个,即可。或者即使*abc*文件名包含abc某个位置(尝试使用所需的文件名唯一的子模式)。或者只是使用鼠标复制/粘贴文件名。
Guntram Blohm

4
@guntram或者甚至可以将文件拖放到Terminal。
pomsky

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
Nick Matteo

b0fh的答案 -这似乎是一个内置的bash从
mgarciaisaia

1
@kundor nope,不在Ubuntu上。注销并执行该工作,或者简单地进行source ~/.profile
Jacob Vlijm

@JacobVlijm ~/bin完全没有内置。Ubuntu和Debian附带~/.profile有行的自定义if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" ; fi。在Mac OS X和CentOS上,您必须自行配置。一个很好的机会是,如果IT部门~/.profile将Ubuntu提供给某人,则机会将与默认的Ubuntu不同,因此,始终提防~/bin非标准是一个好习惯。~/.profile如果您启动带有--no-profile选项的外壳,Bash也可以忽略
Sergiy Kolodyazhnyy

@mgarciaisaia原始评论实际上是为您准备的,^
Sergiy Kolodyazhnyy

28

Bash中有一个鲜为人知的功能,它使您无需调用python或任何其他第三方工具就可以执行此操作,并且只需一行:

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

8
优秀!open但是通常无法正常工作(除非您使用的是Mac OS);xdg-open在大多数GNU / Linux系统上可能会成功。
尼克·马特奥

1
但是bash不是唯一存在的shell,您知道:-)
jamesqf

16

在纯bash中,使用以下select语句:

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

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

设置PS3实在令人难以置信。如果不进行设置,则只会显示默认提示。如果省略break语句,则select语句将一直循环直到您按CTRL-D或CTRL-C。

当然,您也可以单线运行它:

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

解决方案足够简单,并且效果很好。您可以走得更远,并使用别名或函数
Sergiy Kolodyazhnyy

7

您可以安装和使用mcMidnight Commander。这是一个文本菜单界面,它的菜单界面受旧的Norton Commander启发,当人们使用MSDOS(在Windows之前)时很流行。

sudo apt update
sudo apt install mc

并在终端窗口或文本屏幕中启动它,

mc


3

在Linux文件系统上,文件名具有一个非常有趣的属性,称为inode:目录(或folder)是inode的列表,并且哪些文件名指向这些inode。因此,如果您知道索引节点号,则可以尝试使用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

这样做是遍历当前的工作目录(由表示.),并查找目录入口,该目录入口是inode编号为1103743的文件。如果找到该文件,xdg-open将使用默认应用程序打开该文件,然后find退出。究其原因,额外的-and,并-quit为防止xdg-open重新打开该文件,如果存在硬链接文件(这相当于打开同一个文件两次)。


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您要打开的索引替换。


我希望使用{00..20}而不是$(seq -w 0 20),因为它只是减少了一个外部过程。我不确定可移植性。可能是一种bash-ism .. ;-)
奥斯卡

0

这可能是直接回答问题的最简单答案。尝试以下方法:

touch file-1 file-2 file-3

假设我们要打开(或编辑)第二个文件,我们可以执行以下操作:

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

这将输出第二个文件的名称,我们可以将其用作我们要执行的命令的输入,例如:

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

将输出第二个文件的内容。

请注意,可以通过调整ls参数来更改ls打印文件的顺序,man ls有关详细信息,请参见。

[更新]假设您的文件名中没有空格,
感谢@wjandrea的注意。


2
对于包含空格的文件名,这将失败。这个答案可以解决这个问题,但是解析它仍然不是一个好主意ls。反引号也不推荐使用。使用$()代替。
wjandrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.