自己打造基于命令行的书签管理工具

大多数人都是用浏览器自带的书签管理工具存储url, 虽然这个也挺方便,不过当url多了,即使是分类存放,也不是很好找。于是,我就在琢磨着,能不能自制一个基于命令行的书签管理工具。我只要在命令行敲几个关键词就能直接进入网站,毕竟,对于程序猿而言,命令行是最高效的方式。

有了想法,就动手做吧...

思路分析

  • 最终要的效果是:命令行输入关键词,如果这个关键词所包含的url只有一个,就直接打开网址;如果有多个,就罗列并显示序号,通过序号选择;如果没有找到url,就提示查看现有的url列表

最终效果图

  • 书签存放在文件中,每一行一个书签,便于管理 如:
编程入门指南 v1.5 https://zhuanlan.zhihu.com/p/19959253?columnSlug=xiao-jing-mo
Laravel 教程 - Web 开发实战入门 https://fsdhub.com/books/laravel-essential-training-5.1/
Linux命令大全 http://man.linuxde.net/
  • 原理:用python将书签文件读取,存为列表。获取命令行参数,判断参数是否存在于列表中,如果存在,调用chrome浏览器打开url

代码实现

  • chrome安装路径设置为环境变量,便于调用浏览器

我用的是win10自带的ubuntu子系统

export chrome="/mnt/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe"
  • 将书签存储在bookmark.md文件中
  • 操作书签的python代码bookmark.py
#_*_coding:utf8_*_
import sys,os,re
chrome = os.getenv('chrome') # 获取环境变量chrome
keyword = sys.argv[1].lower() # 不区分大小写
url_data = []
file_path = sys.path[0] + '/bookmark.md'

# 需要指定文件编码
with open(file_path, 'rb') as file_object:
    for line in file_object:
        url_data.append(line.decode("UTF-8").strip())

url_arr = []

for url_str in url_data:
    url_str = url_str.lower()
    if keyword in url_str:
        url_arr.append(url_str)

url_len = len(url_arr)

# 获取书签
def getBookbarks(data):
    i = 0
    for x in data:
        print(str(i) + '. ' + x)
        i = i + 1

# 正则匹配url
def matchUrl(url_content):
    url_match = re.search(r"http[^\s]*", url_content)
    url = url_match.group(0).rstrip()
    return url

url = ''
if url_len > 1:
    getBookbarks(url_arr)
    choice = input('选择要进入的url序号\n')
    url = matchUrl(url_arr[int(choice)])
elif url_len == 1:
    url = matchUrl(url_arr[0])
else:
    choice = input('无此书签,是否需要显示所有的书签?y:是 n:否\n')
    if choice == 'y':
        getBookbarks(url_data)

if url:
    print(url)
    os.system(chrome + ' ' + '"' + url + '"')
    exit()
  • 设置程序调用的别名
alias b='python3 /home/wwwroot/script/bookmark/bookmark.py'

如此,一个简便的书签管理器就制作完成了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4638
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6508
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

30610
来自专栏魂祭心

原 canvas绘制clock

3944
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2878
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2517
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2102
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2592
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2657

扫码关注云+社区