一些常用终端命令

分割线

通用

指令作用
cd path / cd .. / cd / / cd ~进入 指定 / 上层 / 根 / home 目录
Ctrl + L清屏
exit退出
ping测试网络通断状态
Ctrl + C停止当前任务
exit停止任务或终端
mkdir新建文件夹
cp(xcopy)/mv/rm文件(夹)复制、移动与删除
curl + URL访问 URL(可加参数,具体百度)
pwd显示当前全路径
dir/ls列出当前目录(样式不同)
cat(按参数格式)输出文件所有内容
clear清屏
echo回显,常用作文本输出
shutdown -h now / reboot关机 / 重启
ls | grep abc过滤 ls 的输出,只显示含"abc"的内容
ls | tee [-a] t.log显示 ls 输出同时[追加]输出到 t.log 里
mktemp临时创建一个 temp 文件
zip "A.zip" "folder_A/**" "folder_B/**"压缩多个文件夹或文件到 zip 文件
md5sum/sha256sum xxx计算文件 hash
scp -r -i ~/.ssh/liuwei_rsa 1.txt project-1@1.2.3.4:/home/project-1/远程文件复制
date +%Y%m%d-%H%M%S.%N20221022-153014.813488400
tar -cf a.tar a.txt b.txt / tar -xf a.tar打包 / 解压

文件末尾追加命令

指令作用
echo 'add content'>/home/data/test.sh覆盖原文件内容
echo 'add content'>>/home/data/test.sh在末尾追加
date +"%Y-%m-%d %H:%M:%S.%N" >> keepchange.txt这种写法也可以,就是把前面当成字符串输入文件

输出重定向

指令作用
ls > ls.txt把 ls 输出内容输出到 ls.txt
>/dev/null把标准输出重定向到黑洞,相当于(1>/dev/null) 标准输入 0,标准输出 1,标准错误 2
>/dev/null 2>&1把标准错误重定向到标准输出,也就是这俩都进了黑洞
2>&1 >/dev/null把标准错误重定向到标准输出(屏幕),标准输出进黑洞

2>/dev/null 和>/dev/null 2>&1 和 2>&1>/dev/null 的区别


启动程序

同步(Synchronous)和异步(Asynchronous) 同步,就是调用某个东西时,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反 调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用

  • start 异步
  • call 同步

清垃圾(?

  • 写脚本时,如果遇到两种情况:

    1. 要删除某路径下所有东西

    2. 路径是变量

    那就有可能就变成删库跑路了…


  • 比如

    set PATH=%1
    rm -rf %PATH%/*

  • PATH 靠调用脚本时传入的参数来定义,没传参数的话就 undefined,以至于下一行变成大名鼎鼎的

    rm -rf /*


与或-管道运算符

command1 & command2 & command3: 不论成败都会执行

command1 && command2 && command3: 左边全都执行成功/返回 0 才会执行右边的命令

command1 || command2 || command2: 左边全都执行失败/返回 1 才会执行右边的命令

command1 | command2: 把左边的命令的输出结果作为右边的命令的输入,例如 ps | grep win


获取文件名

  • 可以用 basename, 用法 [1]

    name=`basename -s .c *.c`
  • 比如想获取下面两个文件的名字 (排除后缀)

    dair_v2x_i_infos_temporal_train.pkl
    dair_v2x_i_infos_temporal_val.pkl
    basename -s .pkl *.pkl

    结果:

    dair_v2x_i_infos_temporal_train
    dair_v2x_i_infos_temporal_val

分割线

Linux

指令作用
su root获取最高权限(需要输入 root 密码)
ifconfig查看网络配置
dhclientDHCP 重新配置 IP
./xxx.sh start/restart/xxx启动/重启 shell 脚本
nohup xxx.sh &不挂起执行 xxx (退出终端不影响程序运行),需要 ps/kill 杀死进程
tail -n 20 README.md输出 READMD 最后 20 行内容(默认是 10 行)
tail -f README.md输出 READMD 追加的更新内容
systemctl start/enable/status xxx.servicexxx 服务-开启/开机启动/状态
touch a.txt创建 a.txt 文件
TOPIC=1234 ./run带着环境变量 TOPIC 执行 run 程序
chmod u+x ./run给 run 赋予执行权限
/etc/init.d/bt default查看宝塔面板入口
ln -s A B创建 A 的符号链接,名为 B [3]
rm/unlink xxx删除虚拟链接 [4]

查杀进程

指令作用
ps -ef/aux显示进程(注意多个进程用’,'隔开而非空格)
kill -9 pid杀死进程
lsof -i:8080 / -i@12:34:56:78Linux 中一切皆文件,此命令可以显示指定文件信息

设置代理

export http_proxy=http://192.168.131.1:7890
export https_proxy=http://192.168.131.1:7890

用户管理

切换用户

命令是 su xxx [2]

  1. 切换到每个用户的密码不一定一样 (主要看设置的是否一样), 为了防止乱切乱改, 每个账户设置独立密码
  2. root 用户下无需密码切换到任何用户
  3. su 与 sudo 所需密码并不是同一个, su 要的是 root 密码, sudo 要的是当前用户密码, sudo 后默认 15 分钟内不需要再次输密码

设置与解锁用户密码

passwd xxx

设置 root 账户密码: sudo passwd root, 之后 su root 就需要密码验证了

有个误区, 之前我误认为每个用户切到 root 账户的密码是独立的, 所以改了服务器的 root 密码… 差点出幺蛾子

解锁 xxx 用户密码: sudo passwd --unlock xxx


删除用户

userdel -r xxx

supervisor

apt-get install supervisor

vim /etc/supervisord.conf

# 启动
supervisord -c supervisord.conf

# 查看状态
supervisorctl status

# 启动/停止服务(组)
supervisorctl start/stop/restart serverName

# 启动/关闭所有服务(组)
supervisorctl start/stop/restart all

# 重新加载所有服务,如果有新添加的服务也会直接加进来并启动, 大概需要十秒, 期间 supervisorctl status 会报错
supervisorctl reload

# 重新加载已添加服务的configuration配置内容,但是不会重启,也不会自动添加新进程/移除进程,和reload不同
# 新加的.ini结尾的新进程(组) 或者更新的配置文件,update添加进来
supervisorctl reread
supervisorctl update xxx

# 查看日志
tail -n 100 /var/log/supervisor/supervisord.log
  • 在 supervisorctl status 有时会出现

    error: <class ‘xmlrpclib.Fault’>, <Fault 6: ‘SHUTDOWN_STATE’>: file: /usr/lib/python2.7/xmlrpclib.py line: 800

    可以执行 /etc/init.d/supervisor stop && /etc/init.d/supervisor start [12]

    但需要注意, 在 supervisorctl reload 执行开始几秒内程序还没重启完确实会出现这种报错, 并非哪有异常


环境变量

PATH=$GOROOT/bin:$PATH

冒号起分隔路径作用, linux 中一个环境变量可对应多个目录, 如

export LD_LIBRARY_PATH=/mnt:/usr/local/3rdlib:$LD_LIBRARY_PATH

意思就是在已有的 LD_LIBRARY_PATH 这个变量基础上再加目录

条件分支判断

linux 下 shell 中 if 的“-e,-d,-f”是什么意思_高晓伟_Steven 的博客-CSDN 博客_linux -d

分割线

windows

指令作用
md创建目录,同 mkdir
rd删除目录,同 rm
del删除文件
cls清屏,同 clear
ipconfig查看网络配置
start + exe打开应用程序
start/explore + URL/HTML文件用默认浏览器打开
microsoft-edge:URL用 edge 打开 URL
xxx /?xxx 的帮助
mklink A B创建 B 的硬链接(仅限文件), 名为 A
mklink /d A B创建 B 的符号链接, 名为 A(scoop-current)
mklink /j A B创建 B 的符号链接, 名为 A(快捷方式)
ren a.jpg b.png重命名 a -> b

powershell

Cannot convert the “xxx” value of type “System.String” to type “System.Security.SecureString”.

需要强制转为 securestring [14]

# Set-OpenAIKey "xxx"

$ss = convertto-securestring "xxx" -asplaintext -force
Set-OpenAIKey $ss

分割线

cli-tools

FFmpeg

批量调整音频音量

网上找了下相关软件/web tools, 没有特别符合要求的, 然后突然想到可以用 AI:

我想通过 FFmpeg 批量降低一些音频文件的音量 (格式包括 mp3 和 wav), 请写一下 shell 程序

oS7qvX.png

# 定义一个函数,接受一个音频文件名和一个音量调整参数(分贝值)
adjust_volume() {
# 使用ffmpeg的volume滤镜来改变音频文件的音量
ffmpeg -i "$1" -filter:a "volume=$2dB" "adjusted/$1"
}

mkdir adjusted

# 遍历当前目录下的所有mp3和wav文件
for file in *.mp3 *.wav; do
# 调用函数,将音量降低5分贝
adjust_volume "$file" -10
done

#!/bin/bash

# 输入和输出文件夹的名称
input_dir="audio"
output_dir="output"

# 音量调整的比例
volume_ratio=0.5

# 创建输出文件夹(如果不存在)
mkdir -p $output_dir

# 遍历输入文件夹中的所有音频文件
for file in $input_dir/*.{mp3,wav}; do
# 获取文件名(不含扩展名)
filename=$(basename -- "$file")
extension="${filename##*.}"
filename="${filename%.*}"

# 使用FFmpeg调整音量并保存到输出文件夹中
ffmpeg -i "$file" -af "volume=$volume_ratio" "$output_dir/$filename.$extension"
done

报错

  • 用的第三方 FFmpeg, 换成官方的就好了

    nb_samples (47) != frame_size (0)

分割线

Git

指令作用
git remote add origin 你的远程库地址添加远程
git add .加入暂存区
git commit -m "提交消息,可添加emoji😝"提交
git push [origin(远程名字,默认是origin) master(分支名字)]推送
git checkout --orphan 新分支名创建一个新分支
git submodule update --init --recursive && git pull --recurse-submodules拉取 submodules

Docker

指令作用
docker ps [-a]列出[所有]容器
docker ps --filter "abcd / status=running筛选出含"abcd"/状态为 running 的容器
docker kill xxx关闭 xxx 容器
docker list| grep abc筛选 docker list 命令中含有 abc 字符串的结果集

Vim

指令作用
:q!如何获得一个随机字符串? >让新手退出 vim
:wqwrite & quit
dd删除行
dGdelete Global

fzf

  • 与 grep 相似,不同点:

    • grep 是查找写死的东西,查找范围固定

    • fzf 可动态查找用户输入的内容,并且范围大

指令作用
fzf模糊查找
ls | fzf在 ls 的输出内容中查找

tldr

命令帮助文档,优化版的 man,有个类似的工具 cheat.sh,一番角逐之下我还是用的 tldr

指令
tldr cd
tldr java

pandoc

word2markdown

pandoc -f docx -t markdown --extract-media ./images -o 1.md 1.docx

分割线

各种问题

换行符导致报错

syntax error near unexpected token `xxx

Linux 并不兼容 windows 下的换行符, 可以通过 vscode 右下角转为 LF [5]


不同终端差异

cmd 不支持/作为路径, PowerShell 支持

安装 git-all + pwsh 可以使用绝大多数 linux 的命令

分割线

借物表

[1]: Linux 技巧:介绍从目录路径获取文件名和目录前缀的方法

[2]: Linux 下如何切换用户

[3]: Linux ln 命令

[4]: 如何正确的删除软连接

[5]: syntax error near unexpected token `原因及解决办法 - 走看看

[6]: 5 款超级好用的命令行工具,提升你的开发效率!

[7]: 推荐 18 个终端命令行工具

[8]: ps -ef 和 ps -aux 和 ps aux | Linux kill 命令 | Linux 命令神器:lsof

[9]: Windows vs linux-查看文件 MD5 值等_51CTO 博客_windows 查看文件 md5 值

[10]: Linux nohup 命令 | Linux tail 命令 | 基于 VSCode 和 CMake 进行 C/C++开发「第一讲」linux 系统介绍

[11]: 批处理定义子程序 | 批处理命令之 Start 的详细用法 | bat 与 shell 互转 Appendix L. Converting DOS Batch Files to Shell Scripts

[12]: Running supervisorctl restart &lt;name&gt; causes xmlrpclib.Fault · Issue #48 · Supervisor/supervisor

[13]: Win10 mklink 命令怎么用,mklink 命令使用教程

[14]: Why can't powershell convert my password from system.string to system.security.securestring?

[15]: SCP Permission denied (publickey). on EC2 only when using -r flag on directories