2025-01-15

旧手机变废为宝|五分钟安装Ollama跑开源大模型 - 开发调优 - LINUX DO

旧手机变废为宝|五分钟安装Ollama跑开源大模型 - 开发调优 - LINUX DO

在开始之前,请你先准备好一台旧Android手机以及特殊的网络环境。

1.安装Termux

Get it on GitHub
Get it on F-Droid

2.更新软件包及依赖

pkg update && pkg upgrade

3.安装wget软件包

pkg install wget

4.下载并运行Ollama安装脚本

wget https://github.com/Dev-ing-ing/ollama-termux/releases/download/v1.0.0/ollama-installer.sh && bash ollama-installer.sh

5.添加环境变量(可选)

export OLLAMA_HOST=0.0.0.0

6.启动Ollama服务

ollama serve

7.新建会话并下载模型

ollama pull qwen2.5:3b

8.在终端与模型对话

ollama run qwen2.5:3b

9.通过聊天软件与模型对话

本地:http://127.0.0.1:11434/v1
局域网:http://192.168.1.2:11434/v1     公网:http://[2409:8a00:1:0:0:0:0:1a2b]:11434/v1

2025-01-07

每个开发者都应该掌握的 10 个终端命令(10 Essential Terminal Commands Every Developer Should Know)

10 Essential Terminal Commands Every Developer Should Know

每个开发者都应该掌握的 10 个终端命令

以下是一些有助于提高工作效率的实用 Unix 终端命令列表。以下是我最喜欢的几个。

有时,用代码可能需要花费数小时才能完成的任务,通过终端几分钟就能搞定。

本文假定您已经熟悉诸如 rm、pwd 和 cd 这类基本命令。

grep

需要在代码库中查找某个函数或变量的使用位置,或者在日志中筛选出特定条目?grep 可以帮您解决这些问题。

grep 命令用于在文件中搜索特定模式。它就像一个超级强大的搜索功能,能够深入文件内容进行查找。

grep 命令的基本语法如下:

Terminal window
grep "let's find something" file.[txt,json,js,md,etc]

不区分大小写的搜索:添加 -i 标志以忽略大小写差异。

Terminal window
grep -i "REact" compiler/apps/playground/app/index.tsx
? '[DEV] React Compiler Playground'
: 'React Compiler Playground'

统计出现次数:使用 -c 标志来统计匹配行的数量。

Terminal window
grep -c "React" compiler/apps/playground/app/index.tsx
2

分析日志:如果您正在排查问题,可以使用 grep 在日志中查找特定的错误消息。

Terminal window
grep -i "Operation not supported on socket" system.log
09/24 08:51:01 INFO :..settcpimage: Get TCP images rc - EDC8112I Operation not supported on socket.

搜索多个模式:您可以通过多次使用 -e 标志来搜索多个模式。

在 system.log 中匹配“error”或“404”。

Terminal window
grep -e "error" -e "404" system.log
npm error code E404
npm error 404 'trevorlasn.com@*' is not in this registry.
npm error A complete log of this run can be found in: /Users/trevorindreklasn/.npm/_logs/2024-08-20T16_41_32_846Z-debug-0.log

递归搜索:若要在目录及其子目录中的所有文件中搜索某个模式,请使用 -r(或 -recursive)标志。

Terminal window
grep -o -r "fs" node_modules | wc -l
22491

这将在指定目录及其子目录中的所有文件中进行搜索。 -o 选项告诉 grep 只打印行中匹配的部分。

管道 | 将左侧命令(grep)的输出作为右侧命令(wc -l)的输入。wc -l 会计算并显示其输入中的行数。

man

man 命令代表“手册”。它能帮助您查找有关其他命令和程序的详细信息。

Terminal window
man grep
NAME
grep, egrep, fgrep, rgrep, bzgrep, bzegrep, bzfgrep, zgrep,
zegrep, zfgrep file pattern searcher
SYNOPSIS
grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num]
[-C num] [-e pattern] [-f file] [--binary-files=value]
[--color[=when]] [--colour[=when]] [--context=num]
[--label] [--line-buffered] [--null] [pattern] [file ...]
DESCRIPTION
The grep utility searches any given input files, selecting
lines that match one or more patterns. By default, a pattern
matches an input line if the regular expression (RE) in the
pattern matches the input line without its trailing newline.
An empty expression matches every line. Each input line that
matches at least one of the patterns is written to the standard
output.
grep is used for simple patterns and basic regular expressions
(BREs); egrep can handle extended regular expressions (EREs).
See re_format(7) for more information on regular expressions.
fgrep is quicker than both grep and egrep, but can only handle
fixed patterns (i.e., it does not interpret regular
expressions). Patterns may consist of one or more lines,
allowing any of the pattern lines to match a portion of the
input.
zgrep, zegrep, and zfgrep act like grep, egrep, and fgrep,
respectively, but accept input files compressed with the
compress(1) or gzip(1) compression utilities. bzgrep, bzegrep,
and bzfgrep act like grep, egrep, and fgrep, respectively, but
accept input files compressed with the bzip2(1) compression
utility.
The following options are available:
-A num, --after-context=num
Print num lines of trailing context after each match.
See also the -B and -C options.
...

cat

“cat”命令是“concatenate”(连接)的缩写。它用于显示文件内容、合并文件或创建新文件。

Terminal window
trevorlasn.com git:(master) cat astro.config.mjs
import { defineConfig } from "astro/config";
import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap";
import tailwind from "@astrojs/tailwind";
import vercel from "@astrojs/vercel/static";
import partytown from "@astrojs/partytown";
// https://astro.build/config
export default defineConfig({
site: "https://www.trevorlasn.com",
integrations: [ mdx(), sitemap(), tailwind(), partytown({
config: {
forward: ["dataLayer.push"]
}
}), ],
output: "static",
adapter: vercel(),
});

合并文件:`cat` 的一个关键特性是能够将多个文件合并为一个。例如,如果您想将 `file1.txt` 和 `file2.txt` 合并到 `file3.txt` 中,可以这样做:

Terminal window
cat file1.txt file2.txt > file3.txt

上述命令将 file1.txt 和 file2.txt 的内容合并到 file3.txt 中。> 运算符用于将合并后的输出定向到一个新文件。

创建新文件:您还可以使用 cat 命令来创建新文件。输入您的文本,完成后按 Ctrl + D 保存并退出。

Terminal window
cat > newfile.txt
hey
ls
newfile.txt
cat newfile.txt
hey

cat 命令有助于查看较小的文件,但对于非常大的文件,它可能会让人应接不暇,因为它会一次性输出所有内容。在这种情况下,使用 less 或 head 等命令以更可控的方式查看文件会更好。

在处理大型文件时,您通常无需查看全部内容。与其使用 cat 命令显示所有内容,不如使用 head 命令仅预览文件的前几行。

这在检查 CSV 文件、日志或任何其他大型文本文件的结构时特别有用。

默认情况下,head 命令会显示文件的前 10 行:

Terminal window
trevorlasn.com git:(master) head package-lock.json
{
"name": "trevorlasn.com",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "trevorlasn.com",
"version": "1.0.0",
"dependencies": {

如果您需要更多或更少的行,可以使用 -n 选项指定确切的行数:

Terminal window
trevorlasn.com git:(master) head -n 5 package-lock.json
{
"name": "trevorlasn.com",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,

预览 CSV 标题:对于 CSV 文件,head 命令非常适合快速查看标题或结构:

Terminal window
head -n 1 username-password-recovery-code.csv
Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location

awk

awk 是一种强大的模式扫描和处理工具。它特别适用于操作和分析文本文件及数据流。

使用 awk,您可以对文件中的数据或命令输出进行筛选、提取和转换。

awk 能够高效地从各种来源提取和组合数据,这得益于其关联数组。假设您有两个 CSV 文件:

员工名单。

Terminal window
cat employees.csv
ID,Name,Department
101,John Doe,Sales
102,Jane Smith,Engineering
103,Jim Brown,Sales

工资表。

Terminal window
cat salaries.csv
ID,Salary
101,50000
102,60000
103,55000

使用 awk 合并这些文件,并显示每位员工的姓名及其薪资。

Terminal window
awk -F',' '
NR==FNR {salaries[$1]=$2; next}
FNR==1 {next}
{print $2, salaries[$1]}
' salaries.csv employees.csv
John Doe 50000
Jane Smith 60000
Jim Brown 55000
  • NR==FNR {salaries[$1]=$2; next}:在处理第一个文件(salaries.csv)时,将薪资存储在关联数组中。员工 ID($1)作为键,薪资($2)作为值。此操作仅针对第一个文件执行。
  • FNR==1 {next}:跳过第二个文件(employees.csv)的标题行。
  • 对于第二个文件(employees.csv)中的每一行,打印员工姓名($2)以及从数组(salaries[$1])中获取的其薪资。

您也可以将结果保存到一个新文件中。

Terminal window
awk -F',' '
NR==FNR {salaries[$1]=$2; next}
FNR==1 {next}
{print $2, salaries[$1]}
' salaries.csv employees.csv > combined.csv
cat combined.csv
John Doe 50000
Jane Smith 60000
Jim Brown 55000

sed

sed 是 Stream Editor(流编辑器)的缩写,是终端中用于文本处理的强大工具。它允许您在文件或数据流中查找、替换、插入或删除文本。

您可以用它进行快速编辑,无需打开文本编辑器,这对于编写脚本和实现自动化来说非常棒。

在文件中替换一个单词或模式:将“Trevor”替换为“John”。

Terminal window
cat hello.md
My name is Trevor
sed -i '' 's/Trevor/John/' hello.md
cat hello.md
My name is John

如果您想要保存更改,请使用 -i 选项。

打印特定行:仅从文件中打印特定行。

Terminal window
trevorlasn.com git:(master) sed -n '2,4p' package-lock.json
"name": "trevorlasn.com",
"version": "1.0.0",
"lockfileVersion": 3,

这会打印出第 2 行到第 4 行的内容。

正则表达式:sed 支持正则表达式,从而能够执行复杂的查找和替换操作。例如,将所有数字替换为“X”:

Terminal window
cat combined.csv
John Doe 50000
Jane Smith 60000
Jim Brown 55000
sed 's/[0-9]/X/g' combined.csv
John Doe XXXXX
Jane Smith XXXXX
Jim Brown XXXXX

批量重命名文件:假设您有多个扩展名为.txt 的文件,并且想要将它们重命名为.md。

Terminal window
ls
1.txt 2.txt 3.txt
for file in *.txt; do
mv "$file" "$(echo "$file" | sed 's/.txt$/.md/')"
done
ls
1.md 2.md 3.md

sed 功能强大,用途广泛,而这些示例只是冰山一角。

tail

tail 是 head 的对应命令。它允许您查看文件的最后几行,而非开头几行。它常用于监控日志文件或查看文档的末尾。默认情况下,tail 会显示文件的最后 10 行。

Terminal window
trevorlasn.com git:(master) tail package.json
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"eslint": "^8.57.0",
"eslint-plugin-astro": "^0.32.0",
"eslint-plugin-jsx-a11y": "^6.8.0",
"typescript": "^5.4.2"
}
}

查看更多或更少的行:您可以使用 -n 选项来调整显示的行数。

Terminal window
trevorlasn.com git:(master) tail -n 15 package.json
"astro": "^4.13.3",
"clsx": "^2.1.0",
"sharp": "^0.33.3",
"tailwind-merge": "^2.2.2",
"tailwindcss": "^3.4.1"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"eslint": "^8.57.0",
"eslint-plugin-astro": "^0.32.0",
"eslint-plugin-jsx-a11y": "^6.8.0",
"typescript": "^5.4.2"
}
}

实时文件监控:tail 最强大的功能之一是 -f 选项,它能让您实时跟踪文件的增长情况。这对于实时查看日志文件特别有用。

Terminal window
tail -f 1.md
11
Changing file

随着新行被添加到 1.md 中,tail 将自动显示它们。

chmod

每个文件都有三组权限:所有者、所属组和其他用户。这些权限通常以类似“rwxr-xr-”的格式表示。

  • r:读权限
  • w:写权限
  • x:执行权限
Terminal window
ls -l sensitive.md
-rw-r--r--@ 1 trevorindreklasn staff 0 Aug 21 15:22 sensitive.md

文件权限 -rw-r-r- 表示:

  • 所有者(trevindreklasn):具有读取(r)和写入(w)权限。
  • 组(员工):具有读取(r)权限。
  • 其他人:具有读取(r)权限。

“@” 符号表示该文件具有扩展属性,这些属性是超出标准文件权限之外的附加元数据。

文件权限控制谁可以读取、写入或执行文件,通过防止未经授权的用户修改或查看敏感数据来确保安全性和适当的访问管理。

要限制对 sensitive.md 的访问,使其仅允许 root 用户或超级管理员查看和写入,您可以使用 chmod 命令来修改文件的权限。

首先,确保文件由 root 用户或超级管理员拥有。您可能需要使用 sudo 来更改所有权:

Terminal window
ls -l sensitive.md
-rw-r--r--@ 1 root staff 0 Aug 21 15:22 sensitive.md
sudo chown root:admin sensitive.md
ls -l sensitive.md
-rw-r-----@ 1 root admin 0 Aug 21 15:22 sensitive.md
sudo chmod 600 sensitive.md
textfiles ls -l sensitive.md
-rw------- 1 root admin 0 Aug 21 15:22 sensitive.md

只有所有者(root)具有读写权限。而组和其他用户没有任何权限。这限制了对该文件的访问,使其仅能由所有者读写。

Improper file permissions can lead to security issues or system problems
  • 未经授权的访问:包含敏感信息(如密码或财务数据)的文件设置过于宽松(例如,权限设置为 777),系统上的任何人都可以读取或修改它。这可能会导致数据泄露或敏感信息被未经授权访问。

  • 恶意软件安装:所有用户都具有写入权限的文件或目录(例如,chmod 777)可能会被攻击者利用来放置恶意脚本或软件,从而有可能危及整个系统。

  • 数据损坏:如果本应只读的文件(例如日志文件或系统配置文件)意外地被赋予了写入权限,用户或应用程序可能会无意中损坏或删除关键数据,从而导致系统不稳定或重要信息丢失。

xargs

xargs 命令使用其他命令的输出来构建和运行命令。它用于将项目列表作为参数传递给另一个命令。

假设你有一份想要删除的文件清单。

Terminal window
ls
1.txt 2.txt 2.md 3.md sensitive.md
# Find all .txt files and delete them
find . -name "*.txt" | xargs rm
ls
2.md 3.md sensitive.md

与其一个一个地删除它们,您可以使用 xargs 将文件列表传递给 rm 命令。

Terminal window
find . -name "*.tmp" | xargs rm

创建多个目录:如果您在一个文件中有一系列目录名称,并且想要创建所有这些目录,可以使用 xargs 和 mkdir 命令。

Terminal window
cat dirs.txt
src
temp
utils
public
ls
2.md 3.md dirs.txt sensitive.md
# Creates each directory listed in the file.
cat dirs.txt | xargs mkdir
ls
2.md dirs.txt sensitive.md temp
3.md public src utils

压缩文件:如果您有多个文件想要使用 gzip 进行压缩,可以使用 xargs 将文件名传递给 gzip。

Terminal window
# Compresses all .log files in the current directory
ls *.log | xargs gzip

find

在您的文件系统中根据各种条件搜索并定位文件和目录。它具有高度的可定制性,并且可以与其他命令结合使用以完成复杂的任务。

Terminal window
find [path] [expression]

find 命令会在 node_modules 目录中搜索“astro”的出现情况,返回具有该名称的文件和目录的路径,包括可执行文件和包文件。

Terminal window
trevorlasn.com git:(master) find node_modules -name "astro"
node_modules/.bin/astro
node_modules/astro
node_modules/astro/dist/runtime/server/render/astro

清理旧日志文件:定期删除一个月前的日志文件以释放磁盘空间。

Terminal window
find /var/log -type f -name "*.log" -mtime +30 -delete

备份重要文件:从主目录中找到所有 .docx 文件并复制到备份位置。

Terminal window
find ~/Documents -name "*.docx" -exec cp {} /path/to/backup/ \;

“find”命令功能极其强大,能够根据各种文件管理任务进行定制。

Honorable Mentions

  • jq:像使用 sed、awk、grep 一样轻松地对结构化数据进行切片、筛选、映射和转换。
  • cut:一个用于从文件的每行中删除部分内容的命令。
  • netstat:一种网络实用程序,用于显示网络连接、路由表和接口统计信息。
  • ping:一种用于测试 IP 网络中主机可达性并测量往返时间的工具。
  • ifconfig:用于配置网络接口的命令(已被 ip 命令取代)。
  • telnet:一个使用 Telnet 协议通过网络与远程主机进行交互的程序。
  • SFTP:一种使用 SSH 协议的交互式文件传输程序。
  • wget:一种网络实用程序,用于通过 HTTP 和 FTP 协议从万维网获取文件。
  • ps:显示有关正在运行的进程的信息。
  • 顶部:一个任务管理器,用于实时查看和管理正在运行的进程。
  • kill:一个用于向进程发送信号的命令,通常用于终止进程。
  • comm:一个逐行比较两个已排序文件的命令。

精选文章

旧手机变废为宝|五分钟安装Ollama跑开源大模型 - 开发调优 - LINUX DO

旧手机变废为宝|五分钟安装Ollama跑开源大模型 - 开发调优 - LINUX DO 在开始之前,请你先准备好一台旧Android手机以及特殊的网络环境。 1.安装Termux 2.更新软件包及依赖 pkg update && pkg upgrade 3.安...