常用的命令及快捷键

本文最后更新于 2025年1月8日 上午

本文主要分享了自己在使用Linux和Windows系统及各种软件过程中常用的命令及快捷键。

注意中文和英文字符-

Linux

Win = Super

快捷键

一般

快捷键 作用
Win+L 锁屏
Ctrl+Alt+T 新建终端
Ctrl+Alt+A(自定) flameshot 截图
Ctrl+Alt+F(自定) fsearch 搜索文件
Ctrl+Shift+N 新建文件夹
Win+I(自定义) 打开设置中心
Ctrl+L 全选文件夹路径
F2 文件(夹)重命名
Win 活动大纲
Win+Tab/Alt+Tab 切换应用程序
Ctrl+Alt+上/下箭头,点击桌面左上角的“Activities” 切换工作区(同一屏幕的全部内容)
Alt+Enter 查看选择文件/文件夹的属性,代替单击右键选择属性
Ctrl+1/2 改变文件夹视图查看方式,图标视图/列表视图
Ctrl+H 显示隐藏文件
双击Ctrl(自定) 打开uTools
启动位于任务栏的程序 Win + 数字键

窗口

快捷键 作用
Win+E(自定义) 新建文件夹窗口
win+H 隐藏窗口
Win+D 隐藏或显示全部应用窗口
Win+A 显示应用程序菜单
Super+箭头 移动窗口位置(左/右:贴左/右;上:最大化;下:恢复)
Ctrl+W 关闭标签页
Ctrl+Q/Alt+F4 (强制)关闭应用程序(窗口)。ALT+F4是基于任务管理器连接结束进程项,CTRL+Q只是关闭的快捷键
Alt+空格(自定) 激活窗口菜单(内含置顶选项,也适用于没有系统标题栏的应用)
Win+Shift+向上/下翻页 将窗口上/下移一个工作区
Win+Shift+上/下/左/右箭头 将窗口上/下/左/右移一个显示器
Alt+F7(自定义) 使用键盘方向键移动窗口,按住Shift键快速贴边,按Enter键确认

目录

快捷键 作用
Backspace 返回上一级目录
Alt+左箭头 回退(搭配Backspace回到下一级目录)
Alt+右箭头 前进(只能响应回退操作)

打开文件夹之后,按backspace删除键就可以返回上一级;或者Alt+←也是可以返回上一级,用Alt+←返回上一级后,按Alt+→键就可以倒退回去一级。

鼠标

  1. 直接拖拉在最大化时的窗口标题可以还原窗口大小,再拖放回去就最大化。
  2. 在音量控制处用鼠标滚轮滚动可以直接调整音量,在任务栏中滚动滚轮可以切换任务栏,工作区则切换工作区。
  3. 工作区里的小窗口可以在不同工作区内拖拉,即移动到另一个工作区的功能。
  4. 按住 Shift 拖动窗口可以吸附上下边缘的移动。
  5. 水平滚动文件,请在按住 Shift 的同时转动鼠标滚轮。
  6. 双击选中词,三击选中整句。
  7. 按住Alt,鼠标可以选中带链接的内容(而不打开链接)。
  8. 按住Shift,鼠标在开头和结尾点击,可以选中全文(不用拖动了)。
  9. 拖动选中可直接完成复制粘贴的操作(对于某些禁止复制粘贴的网站)。
  10. 在Win11,按住Shift,点击鼠标右键,呼出旧版菜单。
  11. 鼠标中间有快捷关闭的功能。

路径

  1. 对于在.zshrc等文件中使用export命令时,举例说明:

    1
    2
    3
    4
    5
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/melodic/lib:/path/else
    export PATH=/home/uusama/mysql/bin:$PATH
    # 例如新增LD_LIBRARY_PATH,注意
    # 1. 使用$LD_LIBRARY_PATH来引用前面定义的LD_LIBRARY_PATH,防止后面的覆盖掉了前面的。
    # 2. 路径之间用英文:分隔,中间不需要加空格。

    系统查找命令时按照冒号分割顺序从前向后依次查找。

    配置路径的文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    sudo updatedb  # 更新数据库

    sudo gedit ~/.bashrc
    source ~/.bashrc
    sudo gedit ~/.zshrc
    source ~/.zshrc

    sudo gedit /etc/profile # 此文件涉及系统的环境,即环境变量相关。这里修改会对所有用户起作用。
    # 不能对zsh直接生效?需要在命令行里运行一遍source ~/.zshrc才能生效。
    source /etc/profile # 让环境变量生效

    sudo gedit /etc/ld.so.conf.d/opencv.conf
    sudo ldconfig # 运行配置

    sudo gedit /etc/ld.so.conf
    sudo ldconfig # 运行配置

    sudo gedit /etc/bash.bashrc
    source /etc/bash.bashrc
  2. Ubuntu快捷方式图标的存放位置:

    • /usr/share/applications
    • /usr/share/icons/Mojave-CT-Night/mimes/scalable
  3. 打开回收站:

    1
    cd ~/.local/share/Trash/files
  4. wine软件安装路径:/home/lll25655/.wine/drive_c/'Program Files (x86)'

  5. 打开eDiary:

    1
    wine /home/lll25655/.wine/drive_c/'Program Files (x86)'/eDiary-4.2.2-win64/eDiary.exe
  6. 第三方库库默认安装路径

    1. /usr/include

    2. /usr/local/include

  7. 字体安装路径:/usr/share/fonts

命令

软件、库的安装、卸载和升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装
sudo apt update # 先更新软件包列表,检查可用的软件包更新
# 查看可选的安装版本
apt-cache search exact_package_name # 你可以使用一个正则表达式来搜索本地 APT 缓存中的包。
apt-cache policy exact_package_name # 如果你指定了软件包的名称,它将显示该软件包是否已经安装,在哪个版本的仓库中可用,以及它的优先级。
sudo apt install exact_package_name[=xxx] # 安装软件,例如:sudo apt install libc6-dev=2.27-3ubuntu1.6

# 卸载(不知名的软件)
apt list --installed | grep -i possible_package_name # 模糊搜索
sudo apt remove exact_package_name # 卸载软件
sudo apt-get purge exact_package_name # 清除配置

# 升级
# apt 可以看作 apt-get 和 apt-cache 命令的子集, 可以为包管理提供必要的命令选项。apt-get 虽然没被弃用,但作为普通用户,还是应该首先使用 apt。
sudo apt update # 更新软件包列表,检查可用的软件包更新
apt list --upgradable # 查看可用安装
sudo apt upgrade # 安装可用的软件包更新
sudo apt install exact_package_name # 直接升级特定的包

优先级:

  • < 0:永远不会安装,
  • 1..99:仅当尚未安装其他版本的软件包时才会安装,
  • 100..499:仅当其他发行版中没有安装或提供其他更新版本时才会安装,
  • 500....989:仅当目标发行版中没有安装或没有更新的版本时才会安装,
  • 990..1000:将安装,除非安装的版本较新,
  • > 1000:将始终安装,即使它强制 APT 降级到旧版本。

默认情况下,每个已安装的软件包版本的优先级为 100,未安装的软件包的优先级为 500。同一软件包可能有多个不同优先级的版本。APT 会安装优先级较高的版本,除非安装的版本较新。

查找查看

辅助搭配

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

1
ls -l /usr/local | grep cuda  # 查询`/usr/local`路径下的软链接,且要求包括`cuda`字符串。

常用选项:

  • -i:忽略大小写进行匹配。
  • -v:反向查找,只打印不匹配的行。
  • -n:显示匹配行的行号。
  • -r:递归查找子目录中的文件。
  • -l:只打印匹配的文件名。
  • -c:只打印匹配的行数。

当前终端

1
2
3
4
5
6
7
8
9
10
cat /etc/shells  # 查看系统安装了的shell
# /usr/bin/zsh为软链接,指向/bin/zsh。可能是为了系统兼容性。
echo $SHELL # 当前的shell。实际没显示成功,但是确实改成功了?
# 切换终端Shell
chsh -s /bin/bash
chsh -s /bin/zsh
chsh -s $(which zsh)
# 或
exec bash # 将命令行从zsh切换为bash
exec zsh # 重新运行zsh命令行工具

环境变量

1
2
echo $PATH
echo $CUDA_HOME

内存

1
2
free -g  # 以 GB 为单位,显示内存使用情况。
# -s 根据指定的间隔时间,持续显示内存使用情况。

文件系统和挂载点

1
2
3
4
# 推荐,可查看到交换空间
cat /etc/fstab
# 或,信息更全,有硬盘使用率等
df -hT

文件(夹)大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看指定目录下的各文件(夹)大小
# du 命令需要在root权限下操作,或者在命令行前加sudo命令也可以。但排序是乱的,不好查看。
# 使用 sort 命令 的 -k 参数设置对第二列的值进行重排,也就是按照文件(夹)名进行排序
sudo du -ah --max-depth=1 --exclude=./proc --exclude=./tmp --exclude=./lost+found --exclude=./media --exclude=./mnt --exclude=./run /path/to/your/folder/ | sort -k 2

# 查看指定目录对应的磁盘空间大小
df -B G /path/to/your/folder/ # 以GB为单位显示指定磁盘文件的使用情况。如果没有指定文件,则显示所有挂载的文件系统的磁盘使用情况。
df -B M /path/to/your/folder/ # MB
# 加路径为当前路径所在的磁盘空间,不加路径为所有。

# 上述两个命令的常用参数:
-a或 -all 显示目录中个别文件的大小。
-h或 --human-readable 以K,M,G为单位,提高信息的可读性。
--max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
-exclude=<目录或文件> 略过指定的目录或文件。

ll # 文件大小以字节为单位显示,并且在输出中的第 5 列。

文件(夹)修改时间

1
ll  # ls -l

版本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Linux内核版本
uname -a # 系统架构x64(x86_64、amd64)
# 系统架构:x64(x86_64、amd64)、arm64(aarch64)、mips64(mips64el)
# cmake
cmake --version
# conda
conda --version
# CPU核心数
nproc
# CPU占用
top
# CUDA
ls -l /usr/local | grep cuda # 检查是否安装了CUDA
nvcc -V # 查看自己安装的CUDA版本
lspci | grep -i nvidia # 检查系统是否有支持 CUDA 编程的 GPU
# cuDNN
apt show libcudnn8 # 通过查询已安装的libcudnn8包来验证cuDNN的版本
# 查看版本(路径可能不一致,有一个命令有输出就行)
cat /usr/include/cudnn_version.h
cat /usr/include/cudnn.h
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
# Eigen
/usr/include/eigen3 # Eigen安装路径
/usr/include/eigen330 # Eigen3.3.0安装路径
/usr/include/eigen340 # Eigen3.4.0安装路径
gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h
# GLIBC_
ldd --version
strings /lib/x86_64-linux-gnu/libm.so.6 |grep GLIBC_ # strings /lib64/libc.so.6 |grep GLIBC_
ll /lib/x86_64-linux-gnu/libm.so.6
# gcc
gcc -v
# java
java -version
# 内存
free
# NVIDIA
lspci | grep -i nvidia # 查看是否安装NVIDIA显卡
nvidia-smi # 查看显卡信息
watch -n 0.2 nvidia-smi # 每 0.2 秒刷新一次
# 显卡型号
lspci | grep -i nvidia
# Opencv
/usr/local # opencv3.1.0安装路径
/usr/local/opencv/opencv320 # opencv3.2.0安装路径
/usr/local/opencv/opencv345 # opencv3.4.5安装路径
pkg-config --modversion opencv # 查询版本
pkg-config --cflags opencv # 得到opencv的安装路径
# -> -I/usr/local/include/opencv -I/usr/local/include
pkg-config --cflags opencv4 # 附加:得到opencv4的安装路径
# openssl
openssl version -a
# Pangolin
find / -name pangolin
# protoc
protoc --version
# python
which python
ll /usr/bin/python
python -V # python --version
sudo update-alternatives --config python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 2
# Qt5.9.9
qmake -v
# ROS
echo $ROS_PACKAGE_PATH

用户手册

Linux man 命令是 "manual" 单词的缩写,用于查看各种命令、函数和配置文件的手册页面。

1
man [选项] [节号] 命令/主题

查找文件

1
2
3
4
5
6
7
8
9
10
11
sudo updatedb  # 更新数据库

# find命令
find / -name httpd.conf # 在根目录下查找文件httpd.conf,表示在整个硬盘查找
find -name your-file-name # 在当前目录中搜索
# 可以使用通配符*来实现粗略匹配
# 可以逻辑运算符not(!)、and(-a)、or(-o) 一起使用以组成的复合条件进行文件查找
find / -name hello_world* 2>/dev/null # 忽略错误信息输出

# locate命令
locate filename

目录列表

1
2
3
4
5
6
7
8
pwd  # 显示当前目录位置 
ls
-a 显示所有文件及目录 ( 以. 开头的隐藏文件也会列出)
-l 以长格式显示文件和目录信息,包括权限、所有者、大小、创建时间等
-h:文件大小以K,M,G为单位,提高信息的可读性
ls /usr/bin/gcc* # 在/usr/bin目录下所有含有gcc前缀的文件
#此处使用 ll 命令更好(可以看到软链接):
ll /usr/bin/gcc*

文件内容

参考链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看整个文件
cat [filename] # cat /home/user/test.txt

# 查看开头几行
head -n [rows] [filename] # head -n 20 /home/user/test.txt

# 查看末尾几行
tail -n [rows] [filename] # tail -n 10 /home/user/test.txt

# 查看中间几行
# 方法一:
cat [filename]| head -n [endRow] | tail -n +[beginRow]
# 查看/home/user/test.txt的10~20行
# head -n 20 表示前20行
# tail -n 10 表示后10行
# tail -n +10 表示第10行之后的
cat /home/user/test.txt| head -n 20 | tail -n +10
# 方法二:
sed -n '[begin],[end]p' [filename]
sed -n '10,20p' /home/user/test.txt

查找过去编辑的文件

1
find . -type f -mmin -10  # 查找过去 10 分钟内编辑的所有文件

历史命令

1
2
3
4
history 5  # 这将显示您最近执行的五个命令,以便于快速调用和重新运行它们。
# 您可以使用感叹号 ( ! ) 后跟命令编号来快速重新执行历史记录中的任何命令。
# 例如,如果您想重新运行上面的mkdir newdir命令(命令号 125),您只需键入:
!125

文件新建、复制、移动、重命名和删除

基本

处理(特别是包含众多小文件的)大文件夹推荐使用[rsync](# rsync)命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
gedit ~/.bashrc	 # 使用gedit打开文件
touch file1.txt # 新建文件

mkdir [-p] dirName # 创建目录。-p 确保目录名称存在,不存在的就建一个。
mkdir -p runoob2/test # 在工作目录下的 runoob2 目录中,建立一个名为 test 的子目录。若 runoob2 目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 runoob2 目录不存在,则产生错误。)
mkdir -p {dev,test,prod}/{backend,frontend} # 使用大括号{}一次性创建多个目录

# 在指定的目录下,创建一个名为 LINK_NAME 的硬链接或符号链接,指向名为 TARGET 的文件或目录。
ln [OPTION]... [-T] TARGET LINK_NAME

# 复制文件或目录cp命令
# 示例
cp file.txt /path/to/destination/
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。
-r 或 --recursive:用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。
-i 或 --interactive:在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。
-p 或 --preserve:保留源文件的权限、所有者和时间戳信息。
在使用 cp 命令复制文件时,如果目标文件夹内存在同名文件,默认情况下,cp 命令会覆盖目标文件夹中的同名文件。
如果你希望在复制文件时避免覆盖同名文件,可以使用 -n 选项(即 --no-clobber),这样如果目标文件夹内存在同名文件,cp 命令将不会覆盖它们。

# Linux `mv`(英文全拼:move file)命令用来为文件或目录改名、或将文件或目录移入其它位置
# 注意:需要先执行`Ctrl+H`显示隐藏文件命令,否则,隐藏文件以及隐藏文件夹不会被移动到新目录
# 将源文件名 source_file 改为目标文件名 dest_file
mv source_file(文件) dest_file(文件)
# 将文件 source_file 移动到目标目录 dest_directory 中
mv source_file(文件) dest_directory(目录)
# 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;
# 目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory
mv source_directory(目录) dest_directory(目录)
# 出错
mv source_directory(目录) dest_file(文件)

# 删除文件和文件夹rm命令
rm -rf test/ # 删除 test 文件夹,删除文件夹要加 -r 参数
-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
# 删除当前目录及其子目录中所有.json文件的bash命令:
find . -name "*.json" -type f -delete
# find:这是主命令,用于查找文件。
# .:这告诉find命令从当前目录开始搜索。
# -name "*.json":这告诉find命令查找所有以.json结尾的文件。
# -type f:这告诉find命令只查找文件,不包括目录。
# -delete:这告诉find命令删除找到的所有文件。

rsync

基本语法
1
sudo apt-get install rsync
  • -a, --archive: 归档模式,表示以递归的方式传输文件,并保持所有文件属性不变
  • --delete: 删除那些target中有而source没有的文件
  • --exclude: 指定排除不进行同步的文件,比如--exclude="*.iso"
  • -h: 以人类可读的格式输出。
  • --progress: 显示进度
  • -v: 详细输出模式
用法

rsync命令不仅可以传输文件夹,还可以传输单个文件。

复制/移动大文件夹

本机使用 rsync 命令时,可以作为cpmv命令的替代方法,将源目录同步到目标目录。

1
2
3
rsync -ahv --progress source/ destination/  # 把source文件夹的内容复制进destination文件夹
rsync -ahv --progress source destination/ # 把source文件夹复制进destination文件夹
rsync -ahv --progress source1/ source2/ destination/ # source1、source2都会被同步到destination目录。
删除大文件夹

在删除包含许多小文件的大文件夹时,可以考虑使用rsync命令,以提高删除速度。以下是具体步骤:

  1. 使用rsync将文件夹同步为空目录,达到快速删除文件的效果。
  2. 删除空目录。

具体命令如下:

1
2
3
4
mkdir empty_dir/  # 创建一个空目录
rsync -ahv --progress --delete empty_dir/ /path/to/your/folder/ # 将目标文件夹同步为空目录,快速删除文件内容
rmdir /path/to/your/folder/ # 删除同步后的空目录
rmdir empty_dir/ # 删除创建的空目录

请替换/path/to/your/folder/为你要删除的文件夹的实际路径。

增量备份

参考链接

rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。

除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。

--link-dest参数用来指定同步时的基准目录。

1
rsync -a --delete --link-dest /compare/path /source/path /target/path

上面命令中,--link-dest参数指定基准目录/compare/path,然后源目录/source/path跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。

下面是一个脚本示例,备份用户的主目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

# A script to perform incremental backups using rsync

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"

mkdir -p "${BACKUP_DIR}"

rsync -av --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
"${BACKUP_PATH}"

rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

上面脚本中,每一次同步都会生成一个新目录${BACKUP_DIR}/${DATETIME},并将软链接${BACKUP_DIR}/latest指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest指向新的备份目录。

mkcd

mkdircd命令合并为一个mkcd命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkcd() {
mkdir -p "$1" && cd "$1"
}

# or
function mkcd {
if [ ! -n "$1" ]; then
echo "Enter mkcd followed by a directory name"
elif [ -d $1 ]; then
echo "\`$1' already exists"
else
mkdir $1 && cd $1
fi
}

这个函数接受一个参数($1),首先使用mkdir -p命令创建一个目录,然后使用cd命令进入这个目录。-p选项可以确保如果目录已经存在,mkdir命令不会报错。

你可以将这个函数添加到你的bash配置文件(如~/.bashrc~/.bash_profile)中,这样每次打开一个新的终端时,这个函数都会被定义。

使用这个函数的方式如下:

1
mkcd new_directory

这将创建一个名为new_directory的新目录,并立即进入这个目录。

下载

wget 与 curl 命令详解

测试网络连接:

1
ping www.baidu.com

wget

1
2
3
4
5
6
7
8
9
sudo apt install wget

# 下载单个文件
wget [options] <URL>
wget -O --show-progress myfile.zip http://www.example.com/testfile.zip # 如果不指定"-O" 选项,wget默认会以 url 路径最后一个 "/" 的后面全部字符为下载的文件名

# 断点续传
wget -c http://www.example.com/testfile.zip # 当下载的文件特别大或者网络原因,文件没有下载完连接就已经被断开,使用 -c 选项可以在网络连接恢复时接着上次的下载任务继续下载,而不需要重头开始下载文件
wget --tries=40 http://www.example.com/testfile.zip # wget默认重试20次连接下载文件,如果网络一直有问题下载可能失败。如果需要的话,你可以使用--tries增加重试次数。

下载超时,尝试添加参数--no-cookie --no-check-certificate

curl

1
2
3
4
5
6
7
8
9
10
11
# 单个文件下载
curl [ -o 自定义文件名| -O] --progress-bar http://www.example.com/index.html
# -o 自定义文件名:把服务器响应输出到指定文件
# -O:与-o选项作用一样,区别在于以 url 路径最后一个"/"之后的部分作为文件名
# 如果这两个选项都不写,curl 默认会把服务器响应内容输出到终端

# 断点续传
curl -O -C 偏移量 http://www.example.com/testfile.zip
# -C 偏移量:从指定的偏移量处继续下载,偏移量以字节为单位
# 如果让curl自动推断出正确的续传位置可以使用 "-" 代替偏移量,例如:
curl -O -C - http://www.example.com/testfile.zip

目录(跳转)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mkdir 新建目录

./(点斜杠)表示当前工作目录的相对路径
.表示当前目录
..表示(当前目录的)父目录

pwd # 打印当前所在目录

cd dir # 切换到指定目录
cd / # 进入根目录
cd ~ # root用户, 相当于 cd /root;普通用户,相当于cd /home/当前用户名,即主目录
cd - # 切换最开始的目录
cd . # 目前所在目录
cd .. # 返回上一层
cd ../.. # 返回上两层
cd ../*** # 进入当前目录父目录的**目录
cd ~=cd /root # 进入root的根目录

# 标记目录
# 记录当前目录路径,待会返回需要用到
cur=`pwd`
# 返回项目
cd $cur
  1. 把目录结构信息保存到文本中,树状图:

    1
    tree > /home/luke/tree.txt
  2. 在终端打开文件管理器:nautilusxdg-open[空格]目标路径。

    1
    2
    3
    4
    5
    nautilus /path/to/directory  # or
    xdg-open /path/to/directory
    # 打开当前终端所在目录
    nautilus . # or
    xdg-open .

压缩解压缩

zip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 一般处理
zip -r FileName.zip DirName # 压缩
unzip test.zip # 解压
unzip -O GBK 6.zip # 解决解压出来中文乱码

# 高级处理
# 压缩、设置密码且分卷
zip -r -P 123456 temp.zip data/
zip -s 10m temp.zip --out data.zip
# 解压缩分卷
# 好用
sudo apt-get install p7zip
sudo apt-get install p7zip-full
sudo apt-get install p7zip-rar
7z x data.zip # 分卷文件在同一文件夹下,解压首文件即可,不需要合并分卷。密码会在解压终端提示输入。
# 不好用
cat data.* > tounzip.zip
unzip -P 123456 tounzip.zip

tar

.tar.gz = .tgz

1
2
tar -zcvf FileName.tar.gz DirName  # 压缩
tar -zxvf cmake-3.23.0-rc1.tar.gz # 解压
  • -c: 创建新的归档文件
  • -z: 使用 gzip 压缩归档文件
  • -v: 显示详细输出,列出被添加到归档中的文件
  • -f: 指定归档文件的名称

tar.xz

1
2
3
4
5
6
7
8
# 压缩
tar -cvf Image.tar Image/
xz -z Image.tar # 如果要保留被压缩的文件加上参数 -k ,如果要设置压缩率加入参数 -0 到 -9 调节压缩率。如果不设置,默认压缩等级是6。

# 解压
# 先将Image.tar.xz 解压成 Image.tar
xz -d Image.tar.xz # 使用 -k 参数来保留被解压缩的文件。
tar -xvf Image.tar # 再用tar xvf Image.tar来解包

xz的参数:

  • -z, --compress: 强制压缩
  • -d, --decompress: 强制解压
  • -k, --keep: 保留(不删除)输入文件

pigz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 压缩文件(夹)
tar --use-compress-program=pigz -cvpf /目录名/文件名.tgz (空格) /boot(压缩的文件或者目录)
--use-compress-program=pigz 是指定 ( pigz )来进行压缩
-cvpf
-c 创建压缩文件
-v 显示压缩或解压的过程
-p 保留原始的权限与属性
-f 目标文件名
--exclude=/xx 排除这个目录不压缩

# 解压文件(夹)
tar --use-compress-program=pigz -xvpf 文件.tgz -C / (这是指定解压到了根目录)(不加默认解压到当前文件夹)
--use-compress-program=pigz 是指定 ( pigz )来进行解压
-xvpf
-x 解开压缩文件
-v 显示压缩或解压的过程
-p 保留原始的权限与属性
-f 目标文件名
-C 指定解压到的目录

设置文件权限

chmod命令的语法

指令名称:chmod

使用权限:所有使用者

使用方式:chmod [-cfvR] [--help] [--version] mode file...

参数格式:

  • u:表示该档案的拥有者。
  • g:表示与该档案的拥有者属于同一个群体(group)者。
  • o:表示其他以外的人。
  • a:表示这三者皆是。
  • +:表示增加权限。
  • -:表示取消权限。
  • =:表示唯一设定权限。
  • r:表示可读取。
  • w:表示可写入。
  • x:表示可执行。
  • X:表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
  • R:对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
1
2
3
4
5
6
7
# 将档案 file1.txt 设为所有人皆可读取
chmod ugo+r file1.txt # 或
chmod a+r file1.txt
# 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入
chmod ug+w,o-w file1.txt file2.txt
# 将目前目录下的所有档案与子目录皆设为任何人可读取
chmod -R a+r *

此外chmod也可以用数字来表示权限,语法为:chmod abc file,其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

一般是三个数字:

  • 第一个数字表示文件所有者的权限。
  • 第二个数字表示与文件所有者同属一个用户组的其他用户的权限。
  • 第三个数字表示其它用户组的权限。

权限分为三种:读(r=4),写(w=2),执行(x=1)。综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)。

所以,chmod 755 设置用户的权限为:

  1. 文件所有者可读可写可执行
  2. 与文件所有者同属一个用户组的其他用户可读可执行
  3. 其它用户组可读可执行

777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限。

chmod 4755chmod 755 的区别在于开头多了一位,这个4表示其他用户执行文件时,具有与所有者相当的权限。具有root的权限。

chmod a=rwx filechmod 777 file效果相同。

chmod ug=rwx,o=x filechmod 771 file效果相同。

1
2
# 查看文件权限
ll

root用户把某个文件权限给到普通用户

1
2
3
4
5
6
7
# 先切换到root环境
su root
# 赋权
chown -R username filepath
# username 指的是 你的普通用户名称
# filepath 指的是 你需要赋权给普通用户的文件夹路径
# 这样普通用户也就可以操作这个路径下的文件了

软/硬链接

区别

Linux ln 命令 - 菜鸟教程

  1. 硬链接
    • 对源文件创建硬链接,修改源文件,被硬链接的文件也会被修改;修改被硬链接的文件,源文件也会被修改。
    • 删除源文件,被硬链接的文件不受影响,因为硬链接和源文件指向相同的文件数据,只有当所有指向该数据的链接都被删除时,文件数据才会被删除。
    • 不允许给目录创建硬链接。
    • 硬链接只有在同一个文件系统中才能创建。(例如,电脑文件硬链接不到 U 盘)
  2. 软链接
    • 对源文件创建软链接,类似于对源文件创建快捷方式。
    • 删除源文件,软链接会失效,因为软链接只是指向源文件路径的引用。
    • 软链接可以对目录进行链接。
    • 软链接可以跨文件系统 ,硬链接不可以。

总结:

  • 硬链接:多个文件名指向同一个文件数据,删除其中一个文件名不会影响文件数据的存在。
  • 软链接:一个文件名指向另一个文件名,删除源文件会导致软链接失效。

创建

1
ln [参数][源文件或目录][目标文件或目录]
  • -s: 软链接(符号链接)
  • -v: 显示详细的处理过程
1
2
3
4
# 给文件创建软链接,为log2013.log文件创建软链接link2013.log,如果log2013.log丢失,link2013.log将失效:
ln -s log2013.log link2013.log
# 给文件创建硬链接,为log2013.log创建硬链接ln2013.log,log2013.log与ln2013.log的各项属性相同
ln log2013.log ln2013.log

如果为源文件创建的目标(硬)链接是文件夹,则会在该文件夹下创建于源文件同名的文件。

你可以使用 find 命令结合 ln 命令来为指定目录下的所有文件在另一个目录下创建硬链接。以下是一个示例脚本,假设你要为 source_dir 目录下的所有文件在 target_dir 目录下创建硬链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

source_dir="/path/to/source_dir"
target_dir="/path/to/target_dir"

# 创建目标目录(如果不存在)
mkdir -p "${target_dir}"

# 遍历 source_dir 目录下的所有文件,并在 target_dir 目录下创建硬链接
find "${source_dir}" -type f | while read -r file; do
# 获取相对路径
relative_path="${file#${source_dir}/}"
# 创建硬链接的目标路径
target_file="${target_dir}/${relative_path}"
# 创建目标文件所在的目录(如果不存在)
mkdir -p "$(dirname "${target_file}")"
# 创建硬链接
ln "${file}" "${target_file}"
done

以下是如何在Python中创建硬链接和软链接的示例代码:

创建硬链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os

def create_hard_link(src_file, dest_file):
try:
os.link(src_file, dest_file)
print(f"硬链接已创建:{src_file} -> {dest_file}")
except FileExistsError:
print(f"目标文件已存在:{dest_file}")
except OSError as e:
print(f"创建硬链接失败:{e}")

src_file = "path/to/your/file.txt"
dest_file = "path/to/backup/folder/file.txt"
create_hard_link(src_file, dest_file)

创建软链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os

def create_soft_link(src_file, dest_file):
try:
os.symlink(src_file, dest_file)
print(f"软链接已创建:{src_file} -> {dest_file}")
except FileExistsError:
print(f"目标文件已存在:{dest_file}")
except OSError as e:
print(f"创建软链接失败:{e}")

src_file = "path/to/your/file.txt"
dest_file = "path/to/backup/folder/file.txt"
create_soft_link(src_file, dest_file)

查看

  • 软链接:

    1
    ll
  • 硬链接。在Linux终端中,可以使用ls命令配合-i选项来查看文件的inode号,从而识别硬链接。所有具有相同inode号的文件都是同一个文件的硬链接。以下是具体步骤:

    1
    2
    3
    4
    5
    # 使用ls -i命令查看文件的inode号:
    ls -i file1
    # 使用find命令查找具有相同inode号的所有文件:
    find . -inum <inode_number> # . 表示载当前目录及其子目录下进行查找,可以换成其它指定目录。
    # 这样,你就可以看到所有指向同一个inode的硬链接文件。

硬盘

挂载硬盘

1
2
3
4
5
# 挂载 U 盘根目录的内容会直接出现在 /mnt/ 文件夹内,
# 而不是 /mnt/ 文件夹内先有一个U盘的名称,名称文件夹内再有内容。
# 因此,如有需要,需要提前在 /mnt/ 下使用 sudo 新建文件夹。
sudo mount /dev/sdX1 /mnt/ # mount part
sudo umount /mnt/ # 卸载

其中,/dev/sdX1是U盘的设备名,你可以使用lsblkfdisk -l命令来查找U盘的设备名。

例如,插入硬盘前后,使用lsblk发现新增:

1
2
sdc      8:32   0   7.3T  0 disk 
└─sdc1 8:33 0 7.3T 0 part

硬盘类型

在Linux系统上,可以使用以下命令来查看硬盘是机械硬盘(HDD)还是固态硬盘(SSD):

1
cat /sys/block/sdX/queue/rotational

sdX替换为硬盘的设备名,比如sda。如果输出是1,则表示是机械硬盘;如果输出是0,则表示是固态硬盘。

除了查看/sys/block目录下的信息外,你还可以使用lsblk命令结合-o选项来获取更多详细信息,包括硬盘类型:

1
lsblk -d -o name,rota
  • lsblk 列出所有块设备。
  • -d 选项只显示磁盘本身,不显示其分区。
  • -o 选项指定要显示的列,其中name表示设备名,rota表示是否是旋转设备(0表示固态硬盘,1表示机械硬盘)。

通过这种方式,你可以在一个命令中看到所有硬盘的类型。

模拟鼠标键盘

https://github.com/jordansissel/xdotool

作用:xdotool允许您以编程方式(或手动)模拟键盘输入和鼠标活动、移动窗口和调整窗口大小等。

用户文档:https://github.com/jordansissel/xdotool/blob/master/xdotool.pod

Linux之xdotool工具安装及实践

安装

  • Debian and Ubuntu: apt-get install xdotool
  • Fedora: dnf install xdotool
  • FreeBSD: pkg install xdotool
  • macOS: brew install xdotool or sudo port install xdotool
  • OpenSUSE: zypper install xdotool

使用

xdotool 支持在一次调用中运行多个命令。

在 GNOME 终端中使用xdotool key Ctrl+c是成功的,使用xdotool key Ctrl+C是失败的(xdotool key ctrl+c在 ROS 下失败),关键在于字母c要小写。在 Terminator 窗口下没有此现象。因此,干脆没有特殊要求就直接用小写吧。

帮助
1
xdotool help
键盘
1
2
3
4
5
6
7
8
9
# 发送按键
xdotool key [options] keystroke [keystroke ...]
[options]
--window window # 将击键发送到特定窗口 ID
--clearmodifiers # 在发送击键之前清除修饰符
--delay milliseconds # 按键之间的延迟。默认值为 12 毫秒

# 示例
xdotool key Ctrl+Shift+W BackSpace

模拟打字并按回车键:

1
2
xdotool type "s
"
1
2
3
4
5
6
# 发送按下/释放按键的事件
xdotool keydown/keyup [options] keystroke
* keydown # [options] 与 key 相同,只是仅发送 keydown(按下)事件。
* keyup # [options] 与 key 相同,只是仅发送 keyup(释放)事件。
# 示例
xdotool keydown n
1
2
3
4
# 发送字符串
xdotool type [options] something to type # [options] 与 key 相同
# 示例
xdotool type 'Hello world!'
鼠标
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将鼠标移动到屏幕上的特定 X 和 Y 坐标。
xdotool mousemove [options] x y OR 'restore'

# 如果指定“restore”而不是 X 和 Y 坐标,则可以将鼠标移动到之前的位置。仅当您之前在同一命令调用中进行过移动时,restore 才有效。此外,它不适用于 --window 选项。
# 示例
xdotool mousemove 0 0 click 1 mousemove restore # 单击屏幕左上角并将鼠标移动到移动之前的原始位置

[options]
--window WINDOW # 指定要相对移动的窗口。坐标 0,0 位于您选择的窗口的左上角。
--screen SCREEN # 将鼠标移动到要移动到的指定屏幕。仅当您有多个屏幕并且不使用 Xinerama 时,这才有用。默认为当前屏幕。如果指定 --window,则忽略 --screen 标志。
--polar # 使用极坐标。这使得“x”成为角度(以度为单位,0-360 等),“y”成为距离。旋转从“向上”(0 度)开始并顺时针旋转:90 = 向右,180 = 向下,270 = 向左。原点默认为当前屏幕的中心。如果指定 --window,则原点是该窗口的中心。
--clearmodifiers # 清除修饰符
--sync # 发送鼠标移动请求后,等待鼠标实际移动。如果没有必要采取行动,我们就不会等待。这对于依赖于在继续之前完成的操作的脚本非常有用。
1
2
# 相对于鼠标光标的当前位置移动鼠标 x,y 像素。
xdotool mousemove_relative [options] x y # [options] 与 mousemove 相同
1
2
3
4
5
6
7
8
9
# 模拟单击
xdotool click [options] button
# 按钮通常这样映射:鼠标左键为 1,中键为 2,右键为 3,向上滚轮为 4,向下滚轮为 5。

[options]
--clearmodifiers # 单击之前清除修饰符
--repeat REPEAT # 指定单击次数。默认值为 1。对于双击,请使用“--repeat 2”
--delay MILLISECONDS # 指定单击之间的延迟时间(以毫秒为单位)。如果--repeat标志设置为 1(默认),则不使用此选项。
--window WINDOW # 指定要向其发送点击的窗口。
1
2
# 与 click 相同,但仅发送鼠标按下/松开操作。
xdotool mousedown/mouseup [options] button
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 输出鼠标光标的 x、y、屏幕和窗口 ID。如果您有多个显示器并且不使用 Xinerama,则屏幕编号将非零。
xdotool getmouselocation [--shell]
--shell # 这使得 getmouselocation 输出可以 eval 的 shell 数据。

# 示例
% xdotool getmouselocation --shell
X=880
Y=443
SCREEN=0
WINDOW=16777250

% eval $(xdotool getmouselocation --shell)
% echo $X,$Y
714,324
1
2
3
# 当鼠标点击屏幕边缘或角落时,将操作绑定到事件。
xdotool behave_screen_edge [options] where command ...
# 略
窗口
1
2
3
# 搜索具有正则表达式模式的标题、名称或类的窗口。
xdotool search [options] pattern
# 略
1
2
3
# 通过单击获取窗口 ID(针对客户端)。对于让脚本向您询问要在哪个窗口上执行操作非常有用。
# 例如,通过单击来杀死一个窗口:
xdotool selectwindow windowkill
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 将操作绑定到窗口上的事件。这使您可以在发生匹配事件时运行其他 xdotool 命令。
xdotool behave window action command ...
* mouse-enter # 当鼠标进入窗口时触发。
* mouse-leave # 当鼠标离开窗口时触发。
* mouse-click # 单击鼠标时触发。具体来说,当释放鼠标按钮时。
* focus # 当窗口获得输入焦点时触发。
* blur # 当窗口失去焦点时触发。

# 示例
# Print the cursor location whenever the mouse enters a currently-visible
# window:
xdotool search --onlyvisible . behave %@ mouse-enter getmouselocation

# Print the window title and pid whenever an xterm gets focus
xdotool search --class xterm behave %@ focus getwindowname getwindowpid

# Emulate focus-follows-mouse
xdotool search . behave %@ mouse-enter windowfocus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 输出当前活动窗口。该命令通常比 getwindowfocus 更可靠。结果保存到窗口堆栈中。
xdotool getactivewindow

# 打印当前焦点窗口的窗口 ID。将结果保存到窗口堆栈。
xdotool getwindowfocus [-f]
# 如果当前窗口没有 WM_CLASS 属性,我们假设它不是一个普通的顶级窗口,并向上遍历父窗口,直到找到一个设置了 WM_CLASS 的窗口并返回该窗口 id。
# 如果您确实希望当前窗口具有焦点并且不关心它是否具有 WM_CLASS 设置,请使用“getwindowfocus -f”

# 激活窗口。
# 该命令与 windowfocus 不同:如果窗口位于另一个桌面上,我们将切换到该桌面。它还使用不同的方法来打开窗口。
xdotool windowactivate [options] [window]

# 输出拥有给定窗口的 PID。
xdotool getwindowpid [window]
# 如果未给出窗口,则默认值为“%1”。如果堆栈上没有窗口,则这是一个错误。

# 输出给定窗口的名称,也称为标题。这是窗口管理器在窗口标题栏中显示的文本。
xdotool getwindowname [window]
# 如果未给出窗口,则默认值为“%1”。如果堆栈上没有窗口,则这是一个错误。

# 输出窗口的几何形状(位置和位置)。这些值包括:x、y、宽度、高度和屏幕编号。
xdotool getwindowgeometry [options] [window]
--shell # 适合 shell 中“eval”的输出值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 关闭一个窗口。此操作将破坏窗口,但不会尝试杀死控制它的客户端。
xdotool windowclose [window]

# 优雅地关上窗户。此操作发送请求,允许应用程序应用关闭确认机制。
xdotool windowquit [window]

# 杀死一扇窗户。此操作将破坏窗口并杀死控制它的客户端。
xdotool windowkill [window]

# 设置有关窗口的属性。
xdotool set_window [options] [windowid=%1]
# 略

# 更改窗口的属性。
windowstate [--add PROPERTY] [--remove PROPERTY] [--toggle PROPERTY] [window]
# 略

# 设置给定窗口的窗口大小
xdotool windowsize [options] [window] width height
# 略

# 将窗口移动到给定位置
xdotool windowmove [options] [window] x y
# 略

# 聚焦一个窗口
xdotool windowfocus [options] [window]
--sync # 发送窗口焦点请求后,等待窗口真正获得焦点。这对于依赖于在继续之前完成的操作的脚本非常有用。

# 映射一个窗口。在 X11 术语中,映射窗口意味着使其在屏幕上可见。
xdotool windowmap [options] [window]
# 略

# 取消映射窗口,使其不再出现在屏幕上。
xdotool windowunmap [options] [window_id=%1]
# 略

# 最小化一个窗口。
xdotool windowminimize [options] [window]
# 略

# 将窗口提升到堆栈顶部。
xdotool windowraise [window_id=%1]
# 略

# 将窗口降低到堆栈底部。
xdotool windowlower [window_id=%1]
# 略

# 重新设置窗口的父级。
xdotool windowreparent [source_window] destination_window
# 略

sleep

Linux sleep命令可以用来将目前动作延迟一段时间。

1
sleep [--help] [--version] number[smhd]
  • --help : 显示辅助讯息
  • --version : 显示版本编号
  • number : 时间长度,后面可接 s、m、h 或 d。其中 s 为秒,m 为 分钟,h 为小时,d 为日数
1
sleep 5m  # 休眠5分钟

后台运行

有时,您需要执行一个即使在您注销终端会话后也会继续运行的命令。nohup(无挂起)命令允许您在后台运行进程而不会中断。例如,使用nohup long_running_command &在后台启动命令,即使在关闭终端后也能保持其运行。此功能对于执行需要在没有持续监督的情况下持续存在的冗长任务或脚本特别有价值。

并行运行

1
2
command1 & command2 & command3
parallel ::: command1 command2 command3

定时关机

https://www.runoob.com/linux/linux-comm-shutdown.html

1
shutdown [-t seconds] [-rkhncfF] time [message]

参数说明

  • -t seconds : 设定在几秒钟之后进行关机程序。
  • -k : 并不会真的关机,只是将警告讯息传送给所有使用者。
  • -r : 关机后重新开机。
  • -h : 关机后停机。
  • -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
  • -c : 取消目前已经进行中的关机动作。
  • -f : 关机时,不做 fsck 动作(检查 Linux 档系统)。
  • -F : 关机时,强迫进行 fsck 动作。
  • time : 设定关机的时间。
  • message : 传送给所有使用者的警告讯息。
1
2
3
4
sudo shutdown -h now  # 立即关机
sudo shutdown -h 10 # 指定 10 分钟后关机
sudo shutdown -r now # 重新启动计算机
sudo shutdown -c # 取消定时关机
1
2
sudo apt-get install at
echo "sudo shutdown -h now" | at 23:00 # 在晚上 11 点关机

小贴士

Linux顺序执行多行命令

  • 分号;
    • 没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都会一条一条执行下去。
  • 逻辑或||
    • 当用此连接符连接多个命令时,前面的命令执行成功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行。
  • 逻辑与&&
    • 当用此连接符连接多个命令时,前面的命令执行成功,才会执行后面的命令,前面的命令执行失败,后面的命令不会执行,与 || 正好相反。
  • 管道符|
    • 当用此连接符连接多个命令时,前面命令执行的正确输出,会交给后面的命令继续处理。若前面的命令执行失败,则会报错,若后面的命令无法处理前面命令的输出,也会报错。

在Linux中使用AppImage

  1. 使其可执行。右键-属性-权限-允许将文件作为程序执行;或,命令行执行:

    1
    2
    3
    4
    chmod u+x <AppImage File>
    # u user 文件所有者
    # + 为指定的用户类型增加权限
    # x 执行权限 设置为可执行权限
  2. 运行 AppImage 文件。使 AppImage 文件可执行后,只需双击它即可运行它。它将看到该软件正在运行,就像您在系统上安装它一样;或,命令行执行:

    1
    ./app.appimage  # sudo
  3. 卸载 AppImage 软件。由于从未安装过该软件,因此无需“卸载”它。只需删除关联的 AppImage 文件,您的软件就会从系统中删除。

其它

  1. Linux diff 命令用于比较文件的差异。diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

  2. 指令需要root权限,要么命令前加sudo进行提权,要么以root身份执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Ubuntu 首次进入 root 用户模式
    # 开启一个新的终端

    # 设置 root 用户密码(Linux下输入的密码默认不会显示出来)
    sudo passwd root
    # 输入一个新的密码: yourpassword
    # 请在确认一遍密码: yourpassword

    # 切换到root用户
    su root
    # 输入刚刚设置的密码

    # 退出root用户
    exit
  3. $表示普通用户,#表示root用户。

  4. 定义环境变量:

    1
    2
    sudo gedit ~/.bashrc
    export OPENAI_API_KEY={Your OpenAI API Key here}
  5. timeout是用来控制程序运行的时间,运行指定的命令。如果在指定时间后仍在运行,则杀死该进程。

    1
    2
    3
    4
    5
    timeout 5s ping www.baidu.com  # 5分钟之后终止ping操作
    s : 秒 (默认)
    m : 分钟
    h : 小时
    d : 天
  6. 等等。

小贴士

  1. 直接在当前文件夹窗口打字,可以搜索该目录及子目录下的文件(夹)。按ESC键退出。
  2. Application 键即位置在键盘上右 Ctrl 键左边的那个键,作用相当于单击鼠标右键。
  3. 误按Ctrl+Alt+F7(进入文字界面)黑屏后按Ctrl+Alt+F1回到图形界面。
  4. 直接将"文件管理器"中的文件拖到"终端"中就可以在终端中得到完整的路径名。

终端Terminal

命令行解释器Shell

终端负责是从用户这里接收输入(键盘、鼠标等输入设备),扔给 Shell,然后把 Shell 返回的结果展示给用户(比如通过显示器)。而 Shell 负责从终端那里拿到用户输入的命令,解析后交给操作系统内核去执行,并把执行结果返回给终端。

Bash

快捷键 作用
Tab zsh自动补全
Ctrl+C 终止进程/命令
Ctrl+V 插入特殊字符。当你按下Ctrl+V后,终端会等待你输入下一个字符,然后将其ASCII值插入到当前位置。例如,如果你按下Ctrl+V然后按Enter,终端将插入一个表示换行的特殊字符。
Shift+Ctrl+C 复制
Shift+Ctrl+V 粘贴
Shift+Ctrl+F 查找
Shift+Ctrl+T 新建标签页
Shift+Ctrl+N 新建同路径窗口
Shift+Ctrl+W 关闭标签页
Shift+Ctrl+Q 关闭窗口
Ctrl+A 光标移动到开始位置
Ctrl+E 光标移动到最末尾
Ctrl+K 删除此处至末尾的所有内容
Ctrl+U 删除此处至开始的所有内容
Ctrl+W 当在控制台或一个xterm窗口敲入文本时, CTRL+W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL+W 删除光标往后(回)到第一个非文字和数字之间的字符。
Ctrl+L 相当于clear,即清屏
Ctrl+Y 将之前已经清除的文本粘贴回来(主要针对CTRL+U或CTRL+W)。
Ctrl+S 冻结终端
Ctrl+Q 解冻终端
Ctrl+T 将光标位置的字符和前一个字符进行位置交换
Ctrl+R 以交互方式搜索命令历史记录
Ctrl+PGUP/PGDN 切换到上/下一个标签页

Terminator

更方便的终端,区别于默认GNOME终端。

快捷键

快捷键 作用
Ctrl+Shift+E 垂直分割窗口
Ctrl+Shift+O 水平分割窗口
F11 全屏
Ctrl+Shift+C 复制
Ctrl+Shift+V 粘贴
Shift+Ctrl+W 关闭(当前)终端
Shift+Ctrl+Q 关闭窗口
Ctrl+Shift+N/Ctrl+Tab 在分割的各窗口之间切换
Alt+Up/Down/Left/Right 移动到上/下/左/右边的终端
Ctrl+Shift+Up/Down/Left/Right 在水平/垂直分割的终端中将分割条向上/下/左/右移动
Ctrl+Shift+X 将分割的某一个窗口放大至全屏使用
Ctrl+Shift+Z 从放大至全屏的某一窗口回到多窗格界面

选中即复制,鼠标中键粘贴。对于单词,双击即可选中,三击选中一行。

配置

修改打开的窗口的默认大小:

1
gedit ~/.config/terminator/config

修改 layouts - default - window0 - size(没有就新增)(对应的是像素值)

1
2
3
4
5
6
7
8
9
10
[layouts]
[[default]]
[[[child1]]]
parent = window0
profile = default
type = Terminal
[[[window0]]]
parent = ""
size = 1500, 900
type = Window

保存,关闭文件。关闭所有终端后,再重新打开就应用更改了。

zsh

特性

  1. 色彩高亮:不同的颜色表明当前命令的类型,并且路径有无下划线表示路径是否存在。
  2. 智能补全:在使用cd切换路径时,按下tab会列出当前目录下的目录和文件,如果是bash,它会提示你手动输入,但是zsh中你可以继续按一下tab进入选择模式,继续使用tab选择,或者使用方向键选择目标目录而不需手动输入。
  3. 按键盘右方向键->直接确定整个补全提示。Ctrl+->按整词顺序依次确定。
  4. d命令“回车”后,会列出我们最近进入的目录历史,并且会给这些目录加上序号,只需要输入对应目录的序号,即可重新进入该目录。

插件

路径:~/.oh-my-zsh/plugins

1
2
3
4
5
6
7
8
9
10
plugins=(
zsh-syntax-highlighting
zsh-autosuggestions
zsh-completions
history-substring-search
git
autojump
extract
sudo
)
  1. zsh-autosuggestions————命令提示/补全。提示和补全有不同实现机制,好用之处在于补全,输入命令会根据输入的历史自动补全,并且随着输入不断修正,如果补全是你期望的结果,按下右方向键接受,再回车即可。

    如果你用缓冲区末尾的光标按下→ key (forward-char widget)或 End (End-of-line widget) ,它就会接受这个建议,用这个建议替换命令行 buffer 的内容。

    配置:

    1. 当您键入命令时,您将看到在光标之后提供的一个柔和的灰色的完成。可以通过设置ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE变量来更改此颜色。

      默认值是 fg = 8,它将从256色调色板中将前景色设置为8色。如果您的终端只支持8种颜色,您将需要使用一个介于0和7之间的数字。

      还可以设置背景颜色,建议可以设置粗体、下划线或突出。例如,这将在青色背景上显示带有粗体、下划线、粉红色文字的建议:

      1
      ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#ff00ff,bg=cyan,bold,underline"
    2. 等等。

  2. autojump:这个插件会自动统计我们经常cd的目录,不同目录会有不同的权重。在我们想要进入某个目录时,使用j <dir-name>即可以帮助我们快速跳转到目标目录。

  3. extract:将各种解压命令集合成使用 x <archived file>来提取压缩文件。

  4. sudo:双击两次ESC自动在句首添加sudo

报错

  1. zsh: corrupt history file /home/XXX/.zsh_history

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 解决:
    cp .zsh_history zsh_history
    rm -f .zsh_history
    strings zsh_history .zsh_history
    # 或
    cd ~
    mv .zsh_history .zsh_history_bad
    strings .zsh_history_bad > .zsh_history
    fc -R .zsh_history
  2. 等等。

Powerlevel10k

下面都是以Oh My Zsh框架为例,其它方式详见Powerlevel10k官方文档

安装

  1. 克隆仓库:

    1
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k  # for Oh My Zsh
  2. Set ZSH_THEME="powerlevel10k/powerlevel10k" in ~/.zshrc.

其它安装方式

(重新)配置:

1
p10k configure

配置向导根据您的偏好创建 ~/.p10k.zsh 。可以通过编辑此文件来完成其他提示自定义。它有大量注释可以帮助您浏览配置选项。

例如:

  1. 配置终端路径显示层数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains
    # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is
    # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first)
    # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers
    # and other directories don't.
    #
    # Optionally, "first" and "last" can be followed by ":<offset>" where <offset> is an integer.
    # This moves the truncation point to the right (positive offset) or to the left (negative offset)
    # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0"
    # respectively.
    typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=first:-1 # default false

    默认显示全路径,现在配置成了显示倒数两个文件夹。

  2. 调整终端窗口大小时出现可怕的混乱

更新

  1. 更新仓库:

    1
    git -C ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k pull  # for Oh My Zsh
  2. 更新 Powerlevel10k 后重新启动 Zsh。不要使用 source ~/.zshrc

其它更新方式

卸载

  1. ~/.zshrc 中删除所有对“p10k”的引用。您可能会在顶部看到此片段:

    1
    2
    3
    if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
    source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
    fi

    底部是这样的:

    1
    [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

    这些是由配置向导添加的。删除它们。

  2. ~/.zshrc~/.zpreztorc~/.zimrc 中删除所有对“powerlevel10k”的引用(其中一些文件可能会丢失 - 这是正常的)。这些引用是您在安装 Powerlevel10k 时手动添加的。如果需要提醒,请参阅安装说明

  3. 验证所有对“p10k”和“powerlevel10k”的引用均已从 ~/.zshrc~/.zpreztorc~/.zimrc 中消失:

    1
    grep -E 'p10k|powerlevel10k' ~/.zshrc ~/.zpreztorc ~/.zimrc 2>/dev/null

    如果此命令产生输出,则仍然引用“p10k”或“powerlevel10k”。你需要删除它们。

  4. 删除Powerlevel10k配置文件。该文件由配置向导创建,可能包含您自己的手动编辑。

    1
    rm -f ~/.p10k.zsh
  5. 删除Powerlevel10k源文件。这些文件已在您安装 Powerlevel10k 时下载。删除它们的命令取决于您选择的安装方法。如果需要提醒,请参阅安装说明

    1
    rm -rf -- ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k  # for Oh My Zsh
  6. 重新启动 Zsh。不要使用 source ~/.zshrc

  7. 删除 Powerlevel10k 缓存文件:

    1
    rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}"/p10k-*(N) "${XDG_CACHE_HOME:-$HOME/.cache}"/gitstatus
  8. 完成。

其它卸载方式

导出配置文件

bash

1
gedit ~/.bashrc

zsh

1
gedit ~/.zshrc

gnome-terminal

1
2
3
4
# 导出
dconf dump /org/gnome/terminal/legacy/profiles:/ > ~/Documents/gnome-terminal-profiles.dconf
# 导入
dconf load /org/gnome/terminal/legacy/profiles:/ < ~/Documents/gnome-terminal-profiles.dconf

报错:

  • 错误:密钥文件不以组开头

  • 原因: .dconf 文件的引导行是问题所在:default='...'

  • 解决:用这个替换引导线似乎使它可以加载:[/]

    因此,如果它有帮助,您尝试加载的文件应具有如下所示的格式。请注意标题中的列表项与下面的条目一一对应。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    [/]
    list=['22cb430e-3fde-42cb-a167-cc35a6b788cc', '4b1f055e-9bc4-4b58-bb12-eb5657db78fc']

    [:22cb430e-3fde-42cb-a167-cc35a6b788cc]
    audible-bell=false
    background-color='rgb(255,255,221)'
    cursor-shape='ibeam'
    foreground-color='rgb(0,0,0)'
    palette=['rgb(46,52,54)', 'rgb(204,0,0)', 'rgb(58,43,143)', 'rgb(196,160,0)', 'rgb(52,101,164)', 'rgb(117,80,123)', 'rgb(6,152,154)', 'rgb(211,215,207)', 'rgb(85,87,83)', 'rgb(239,41,41)', 'rgb(150,52,226)', 'rgb(252,233,79)', 'rgb(114,159,207)', 'rgb(173,127,168)', 'rgb(52,226,226)', 'rgb(238,238,236)']
    use-theme-colors=false
    visible-name='light'

    [:4b1f055e-9bc4-4b58-bb12-eb5657db78fc]
    audible-bell=false
    background-color='rgb(0,0,0)'
    background-transparency-percent=17
    cursor-shape='ibeam'
    font='Monospace 12'
    foreground-color='rgb(172,228,255)'
    palette=['rgb(46,52,54)', 'rgb(175,95,255)', 'rgb(0,102,255)', 'rgb(196,160,0)', 'rgb(255,7,168)', 'rgb(117,80,123)', 'rgb(6,152,154)', 'rgb(211,215,207)', 'rgb(85,87,83)', 'rgb(235,148,255)', 'rgb(0,229,255)', 'rgb(252,233,79)', 'rgb(114,159,207)', 'rgb(173,127,168)', 'rgb(52,226,226)', 'rgb(238,238,236)']
    use-system-font=true
    use-theme-colors=false
    use-theme-transparency=false
    use-transparent-background=true
    visible-name='hi'

Terminator

1
gedit ~/.config/terminator/config

Powerlevel10k

1
gedit ~/.p10k.zsh

小技巧

Shell脚本一次性启动多个程序(对应多个终端)

经常开发ros环境的应该知道,当节点太多难以控制的时候,不如写个脚本直接启动多个节点(对应多个终端)。

先介绍一下gnome-terminal命令的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
gnome-terminal  # 打开一个新的终端
# 参数
# 基本用法
--maximize # 打开后自动最大化
--full-screen # 打开后全屏
--window # 打开多个终端,多个标签页
gnome-terminal --window --window #打开两个
gnome-terminal --window --tab --window --tab --tab #打开两个,第一个两个tab,第二个3个tab
-t # 设置终端的标题。注意,有些版本不支持。
# 设置打开的位置和大小(宽度x高度+左侧偏移量+上方偏移量)
gnome-terminal --geometry=80x25+10+10

# 启动后自动执行命令
-e # 可以出现多次。如果在所有--window前面,表示对所有window和tab起作用,如果在--window或者--tab后面,表示只针对这个tab执行,要注意-e后面只能有一个参数,也就是说如果有空格,需要用引号。
-x # 只能出现一次,在-x后面的所有内容,均认为是要执行的命令,所以可以出现空格,这些命令是针对所有tab都执行的。
gnome-terminal -x bash -c "ls"
gnome-terminal -e 'bash -c "ls"'
# 注,运行时会警告:
# 参数“-x”弃用并可能在 gnome-terminal 的后续版本中移除。
# 参数“-e”弃用并可能在 gnome-terminal 的后续版本中移除
# 使用“-- ”以结束选项并将要执行的命令行追加至其后。
# 所以,现在可以直接用“--”来替换掉“-x”和“-e”了。

# 执行完成后保持终端不自动关闭。
# 1. 最后加上exec bash的命令,并用分号跟前面的命令隔开。
gnome-terminal -x bash -c "ls; exec bash"
gnome-terminal -e 'bash -c "ls; exec bash"'
# 2. 修改terminal的配置,在terminal点右键,选择Profiles->Profile Preferences,然后找到Title and Command,里面有一项When command exits,后面选择为Hold the terminal open,然后就可以了。
# 3. 把结果重定向给less,这样less执行完之前,是不会退出的。
gnome-terminal -x ls|less

了解上面后我们可以创建属于自己的脚本了:

  1. 在ROS工作空间(例如,catkin_ws文件夹)下创建一个脚本文件,例如runROS.sh

  2. 写入内容,例如:

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    gnome-terminal --window -- bash -c "source ./devel/setup.bash && roslaunch PACKAGE_NAME *.launch; exec bash"
    sleep 3s
    gnome-terminal --window -- bash -c "source ./devel/setup.bash && rosrun PACKAGE_NAME NODE_NAME *.yaml; exec bash"
    sleep 3s
    gnome-terminal --window -- bash -c "rosbag play /yourfolder/*.bag; exec bash"

    需要什么节点按照这个模块添加即可。

    对于使用Terminator终端和zsh shell,修改文件内容为:

    1
    2
    3
    4
    5
    6
    #!/bin/zsh
    terminator -e "zsh -c 'source ./devel/setup.zsh && roslaunch PACKAGE_NAME *.launch; exec zsh'"
    sleep 3s
    terminator -e "zsh -c 'source ./devel/setup.zsh && rosrun PACKAGE_NAME NODE_NAME *.yaml; exec zsh'"
    sleep 3s
    terminator -e "zsh -c 'source ./devel/setup.zsh && rosbag play /yourfolder/*.bag; exec zsh'"

    这里播放rosbag前面需要加上source ./devel/setup.zsh,否则会报错zsh:1: command not found: rosbag

    如果exec zsh命令未能在命令运行完成后保持终端窗口打开,可以尝试修改terminal的配置,在terminal点右键,选择Profiles->Profile Preferences,然后找到Title and Command,里面有一项When command exits,后面选择为Hold the terminal open。

    因为roscoreroslanuch打开ROS节点后不会自行关闭,需要使用快捷键Ctrl+C手动关闭,所以不会运行到exec zsh这一步。

    而且,使用快捷键Ctrl+C手动关闭ROS节点后,终端会直接退出,也就是关闭窗口(这个BUG?反而能自动关闭终端窗口,减少了自己的操作?)。

    如果Ctrl+C后不想关闭终端,可以在terminal点右键,选择Profiles->Profile Preferences,然后找到Title and Command,里面有一项When command exits,后面选择为Hold the terminal open。不过即使这样,当前终端也不再能输入命令,只能使用Terminator的功能水平分割/数值分割另起一个终端。

    当我手动 Ctrl + C 关闭 gnome-terminal + zsh,时,程序完全退出后才会关闭终端窗口。但当我使用 xdotool 模拟 Ctrl + C时,就算保持窗口常开,程序也会直接退出(留下一个临时文件),而不像手动时会处理完临时文件后再退出。相反,当我使用 gnome-terminal + bash 时,程序总会完全退出并保持窗口。这在有些情况下反而是可取的。

  3. 给脚本文件授予权限:

    1
    sudo chmod 755 runROS.sh

    chmod 755 设置用户的权限为:

    1. 文件所有者可读可写可执行。
    2. 与文件所有者同属一个用户组的其他用户可读可执行。
    3. 其它用户组可读可执行。
  4. 运行脚本文件:

    1
    2
    cd catkin_ws
    ./runROS.sh
  5. 完成。

进阶使用

Shell脚本在语句报错后终止运行

shell脚本在语句报错后默认仍会继续向下执行,解决方法为:

1
2
3
4
5
6
7
8
#!/bin/bash
# 增加语句
set -e
# 或,二选一即可
set -o errexit
# 或,使用逻辑与
python3 main.py &&
python3 do.py

默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。

set -x用来在运行结果之前,先输出执行的那一行命令。执行echo bar之前,该命令会先打印出来,行首以+表示。这对于调试复杂的脚本是很有用的。

Shell脚本自动输入密码

1
echo "password" | sudo -S command  # 可见加上-S参数sudo才会从标准输入中读取密码,不加-S参数以上命令将起不到作用

Shell脚本按下Ctrl+C后仍可以执行功能

How to handle ctrl+c in bash scripts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

cleanup(){
echo ""
echo "CTRL+C pressed, clean up things before exiting..."
rm -rf test.tmp 2>/dev/null
exit 1
}

# Trap the SIGINT signal (Ctrl+C)
trap cleanup SIGINT

while true; do
touch test.tmp
sleep 1
echo "Running..."
rm -f test.tmp
done

trap命令允许捕获信号(Ctrl+C是SIGINT信号)并在捕获后执行命令,trap语法如下:

1
trap function_command_to_execute SIGNAL
  • 为什么你使用 echo 两次?
    • 按 ctrl+c 而不输入换行符会弄乱输出。
  • 为什么将 stderr 重定向到/dev/null
    • /dev/null是一个特殊的设备名称,充当黑洞!你扔在那里的所有东西都会消失!这样,如果我们尝试删除的文件已经被删除,则屏幕上不会显示错误,这可能会无缘无故地让用户感到困惑!
  • 为什么用 exit 1 退出脚本?
    • 退出代码非常有用!退出代码 0 表示程序/脚本按预期完成,其他任何值都可能表示因异常方式或错误退出。
    • 这使得故障排除更加容易,而且还允许控制流,我们可以使用 $? 读取脚本或程序的退出状态。这允许 bash 脚本决定如果另一个脚本或程序异常退出时该怎么做。

为Shell脚本中的文本着色

Linux: How to colorize text in bash scripts

Shell脚本调试

在 Shell 脚本中,可以使用 exit 命令来终止脚本的执行。exit 命令会立即停止脚本的运行,并可以选择性地返回一个状态码。

你可以选择性地提供一个状态码,例如 exit 1,表示脚本以错误状态退出。

文件备份与同步

  1. 创建硬链接

  2. 使用操作系统的文件同步工具

    • Windows: 使用robocopy命令。

      创建一个批处理脚本来定期同步文件:

      1
      2
      3
      4
      5
      6
      7
      @echo off
      set src_file="C:\path\to\your\file.txt"
      set dest_file="D:\path\to\backup\folder\file.txt"
      :loop
      robocopy %src_file% %dest_file% /MIR
      timeout /t 60
      goto loop
    • Linux: 使用rsync命令。

      创建一个Shell脚本来定期同步文件:

      1
      2
      3
      4
      5
      6
      7
      #!/bin/bash
      src_file="/path/to/your/file.txt"
      dest_file="/path/to/backup/folder/file.txt"
      while true; do
      rsync -av --delete "$src_file" "$dest_file"
      sleep 60
      done
  3. 使用文件系统监控工具

    你可以使用Python中的watchdog库来监控文件的更改,并在文件发生更改时自动复制到备份文件夹。

    1
    pip install watchdog

    编写Python脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import time
    import shutil
    from watchdog.observers import Observer
    from watchdog.events import FileSystemEventHandler

    class FileChangeHandler(FileSystemEventHandler):
    def __init__(self, src_path, dest_path):
    self.src_path = src_path
    self.dest_path = dest_path

    def on_modified(self, event):
    if event.src_path == self.src_path:
    shutil.copy2(self.src_path, self.dest_path)
    print(f"File {self.src_path} has been backed up to {self.dest_path}")

    def monitor_file(src_path, dest_path):
    event_handler = FileChangeHandler(src_path, dest_path)
    observer = Observer()
    observer.schedule(event_handler, path=src_path, recursive=False)
    observer.start()
    try:
    while True:
    time.sleep(1)
    except KeyboardInterrupt:
    observer.stop()
    observer.join()

    if __name__ == "__main__":
    src_file = "path/to/your/file.txt"
    dest_file = "path/to/backup/folder/file.txt"
    monitor_file(src_file, dest_file)
  4. 使用云存储服务。你可以使用云存储服务(如Dropbox、Google Drive、OneDrive等)来自动同步文件。将文件放在云存储的同步文件夹中,云存储服务会自动同步文件到云端和其他设备。

Windows

快捷键

快捷键 作用 自定义
虚拟桌面
Win+Ctrl+D 创建新的虚拟桌面,并切换到它
Win+Ctrl+<-/-> 切换桌面 Ctrl+Alt+↑/↓
Win+Tab 打开任务视图
窗口
Ctrl+N 新建当前窗口
Ctrl+Shift+N 新建文件夹
Win+ D 将所有打开的窗口最小化,并转到桌面,再次按下即刻恢复所有内容
Win+<-/-> 可以自动将应用窗口完全贴靠到屏幕两侧
Win+ ↑ 可以将应用窗口最大化
Win+ ↓ 可以将应用窗口最小化。若是当前窗口处于最大化状态,则按住 Win 键不放,连续按两下 ↓ 键即可将窗口最小化。
Win+V 查看剪切板历史

其它一些可参考Linux快捷键

其它:

  1. 将窗口移动到另一个虚拟桌面(不幸的是,Windows不包括直接用于在虚拟桌面之间移动窗口的键盘快捷键):Win+Tab打开任务视图后,使用鼠标拖动应用窗口到另一个虚拟桌面。
  2. Windows 10 系统 Win+<-/-> 分屏失效处理方法:控制面板-外观和个性化-轻松使用设置中心-使鼠标更易于使用-取消勾选"将窗口移动到屏幕边缘时不要自动排列窗口"。
  3. 设置快捷键:开始菜单-找到“Anaconda Powershell Prompt”-右键:打开文件位置-属性-快捷方式-快捷键:Ctrl+Alt+T。

Powershell

  1. Powershell 配置 alias:

    1. 打开 Powershell,执行echo $PROFILE命令,确定新建文件的名称和位置。

    2. 例如:在C:\Users\username\Documents\WindowsPowerShell文件夹下新建Microsoft.PowerShell_profile.ps1文件。

    3. 按格式输入命令:

      1
      2
      function 别名 { 需要替代的命令 }
      Set-alias 's' 'Select-Object'
    4. 以管理员身份打开Powershell 执行命令:

      1
      2
      Set-ExecutionPolicy RemoteSigned
      # `Set-ExecutionPolicy RemoteSigned` 是一个 Windows PowerShell 命令,用于设置 PowerShell 执行策略。执行策略用于控制是否允许在系统上运行脚本,以及允许哪些来源的脚本运行。
    5. 重启Powershell。

  2. Powershell 执行多条命令:

    1
    2
    3
    # 在powershell7上已经支持&&操作,如低于该版本请继续往下看
    (mkdir test) -and (cd test)
    mkdir test;cd test
  3. 将cmd/powershell中的打印信息输出保存为txt文本文件:

    1
    ping www.baidu.com >D:/log.txt

    保存界面上已经执行过的输出内容:点击powershell左上角的下三角形,或直接Ctrl+Shift+P打开命令面板,找到“导出文本”选项,确认保存位置。

  4. 打开网址:

    1
    2
    3
    4
    # starts with default browser and adds to open browser
    Start-Process -FilePath www.google.com
    # starts with a specific browser
    Start-Process -FilePath iexplore -ArgumentList www.google.com
  5. 等等。

命令

复制文件(夹)

robocopy

发现如果直接在桌面拖动文件夹进行复制,如果被复制的文件夹内有不正常的文件,整个复制过程就不会被执行。因此,使用命令行执行复制操作。原意是查看是哪个文件破坏了整个复制过程,结果发现可以直接跳过不正常的文件。

1
robocopy <source> <destination> [<file>[ ...]] [<options>]

最好以管理员方式启动终端?以保证复制过程没有文件权限问题。

无论文件夹路径最后加不加\,都是将 source 文件夹下的内容复制进 destination 文件夹,而不是复制进 source 文件夹本身。所以要提前新件号 destination 文件夹。

官方文档

  • source: 指定源目录的路径。
  • destination: 指定目标目录的路径。
  • file: 指定要复制的一个或多个文件。支持通配符( *? )。如果不指定此参数,则使用*.*作为默认值。
  • options:指定与robocopy命令一起使用的选项,包括copyfileretryloggingjob选项。
    • /s: 复制子目录。此选项自动排除空目录。
    • /e: 复制子目录。此选项自动包含空目录。
    • /v: 生成详细输出,并显示所有跳过的文件。
    • /mt:<n>: 创建具有n 个线程的多线程副本。 n必须是 1 到 128 之间的整数。n的默认值为 8。为了获得更好的性能,请使用/log选项重定向输出。(慎用,如果遇到复制错误的文件,会卡在那里重复尝试)
1
robocopy "C:\source_folder" "D:\destination_folder" /e /v

复制大量小文件

如果你要复制的文件夹内包含大量小文件,可以考虑以下几种方法来提高复制效率:

  1. 使用 robocopy 的多线程选项

    robocopy 支持多线程复制,可以显著提高复制大量小文件的速度。

    1
    robocopy "C:\source_folder" "D:\destination_folder" /e /mt:16

    就算不用多线程也很快。

  2. 压缩文件夹再复制

    将文件夹压缩成一个压缩文件(如 .zip),然后复制压缩文件,最后在目标位置解压。这种方法可以减少文件系统的开销。

    1
    2
    3
    Compress-Archive -Path "C:\source_folder" -DestinationPath "C:\source_folder.zip"  # 使用 PowerShell 压缩文件夹
    copy "C:\source_folder.zip" "D:\destination_folder.zip" # 复制压缩文件
    Expand-Archive -Path "D:\destination_folder.zip" -DestinationPath "D:\destination_folder" # 使用 PowerShell 解压文件夹
  3. 使用第三方工具

    一些第三方工具如 FastCopyTeraCopy 专门优化了文件复制过程,特别是对于大量小文件的复制。

    1
    2
    3
    # 下载并安装 FastCopy。
    # 使用命令行进行复制
    fastcopy.exe /cmd=diff /auto_close "C:\source_folder" /to="D:\destination_folder"
  4. 使用 rsync(适用于 Windows Subsystem for Linux)

    如果你在 Windows 上安装了 WSL,可以使用 rsync,它在处理大量小文件时表现良好。

    1
    rsync -av --progress /mnt/c/source_folder /mnt/d/destination_folder

选择适合你的方法来提高复制大量小文件的效率。

定时关机

https://learn.microsoft.com/de-de/windows-server/administration/windows-commands/shutdown

Win11怎么设置自动关机?Win11使用shut down命令自动关机的方法

允许您一次关闭或重新启动一台本地计算机或远程计算机。

1
2
3
4
5
6
shutdown -help  # 显示用法
shutdown -i # 显示图形用户界面(GUI)
shutdown -s -t 3600 # 3600秒后关机
shutdown -r -t 3600 # 3600秒后重启
shutdown -h # 休眠
shutdown -a # 取消关机,或者取消重启

还可以按 Win+R 快捷键后,在“打开”处输入at 16:00 shutdown -s。(TODO)

小贴士

文件(夹)命名

命名规范

为了确保日常使用的方便与系统兼容性,个人电脑上的文件夹和文件命名应遵循一定的规范。以下是一些通用的指导原则和最佳实践:

  1. 简洁明了:命名应简单且直接表达文件内容或文件夹用途,避免过长或含糊不清的名称。
  2. 避免使用特殊字符:一般来说,文件名中不应包含如下字符:\/:*?"<>|。这些特殊字符在多数操作系统中有特定用途,可能导致错误或不被识别。
  3. 使用合适的文件扩展名:文件扩展名反映了文件的类型,如 .txt 表示文本文件,.jpg 表示JPEG图像文件。正确的扩展名有助于操作系统正确识别和打开文件。
  4. 利用日期和版本控制:在文件名中包含日期(如 2023-03-15)可以帮助管理文件版本。对于频繁更新的文档,可能还需要添加版本号(如 v1.0v2.0)。
  5. 避免空格:虽然大多数现代操作系统可以很好地处理文件名中的空格,但在某些情况下(如命令行操作或网络传输)可能会引起问题。可以使用下划线(_)或破折号(-)来代替空格。
  6. 区分大小写:虽然Windows系统的文件名不区分大小写,但Linux和macOS区分大小写。为了兼容性,最好在命名时注意大小写的一致性。
  7. 组织性和易读性:对于包含多个文件的文件夹,可以采用有组织的命名体系,如按功能、日期或项目分类。
  8. 国际化和本地化:如果你的文件可能会被不同语言的用户访问,避免使用特定语言的字符,尽量使用英文和国际通用的符号。

遵循这些基本原则可以帮助提升文件管理的效率和降低因命名不当引起的问题。如果有特定的组织或项目命名规则,也应优先遵守这些专业指导标准。

命名方法

整词用驼峰或下划线_命名,整词间用-分隔。

在个人电脑上命名文件夹和文件时,虽然没有像编程语言那样严格的命名规范,但仍可以借鉴一些编程中的命名方法来组织文件,使其更加有序和易于管理。以下是一些常见的命名方法,以及如何将它们应用于文件和文件夹的命名:

  1. 小驼峰式命名法 (lowerCamelCase):
    • 应用: 适用于文件名,尤其是在需要保持名称简洁且连贯的情况下。
    • 示例: personalBudget.xlsx, summerVacationPhotos.jpg
  2. 大驼峰式命名法 (UpperCamelCase):
    • 应用: 适合用于较重要的文件和项目文件夹,特别是在编程项目中。
    • 示例: ProjectReport2023.docx, TaxDocuments2023
  3. 下划线命名法 (snake_case):
    • 应用: 适用于需要强调易读性的情况,也有助于避免在使用某些操作系统和环境时出现问题。
    • 示例: final_report_2023.pdf, holiday_photos_2022
  4. 破折号命名法 (kebab-case):
    • 应用: 更常见于网页文件和资源,但也可以用于普通文件和文件夹。
    • 示例: end-of-year-summary-2023.pdf, project-budget-2023.xlsx
    • 注意: 文件系统如Windows和记录系统通常对破折号支持良好,但在某些命令行环境中可能会遇到解释上的问题。
  5. 日期前缀命名:
    • 应用: 对于需要按日期管理的文档或文件,如财务文件或定期报告。
    • 示例: 2023-01-30_MeetingNotes.docx, 2023-03-15_Invoice.pdf

选择哪种命名方法取决于个人偏好、所处的工作环境以及是否需要跨平台交互。例如,如果在一个环境中主要用Python编程,那么使用snake_case可能更自然。而如果是在处理法律或业务文档,使用UpperCamelCase或日期前缀可能更为合适。

无论选择哪种命名方法,重要的是保持一致性,这样可以减少寻找和管理文件的时间,也能使文件系统更加有序。

中文文本中夹用英文时,是否要留有空格

推荐留空,方便整词选择。如果不留空,选择时可能会选择夹杂中英文的整行而不是单个英文单词。

中文文本中夹用英文时,应根据所选用的中英文字体、字符间距以及排版的视觉效果决定英文词句与中文文字之间是否留有空格间距。如留空格,应保证体例的统一。——中华人民共和国新闻出版行业标准CY/T 154—2017号《中文出版物夹用英文的编辑规范》第8.1节

  • 但同时我更鼓励各类排版引擎自动在用户没有显式输入空格字符的情况下,也在中英文词汇间产生适当的间距。现在有一些已经做到了,比如 iOS 系统、微信、Microsoft 办公软件等。

浏览器搜索操作符

可以直接用此网址,不需要记命令,它自动组装为命令:

语法:

  • 整词搜索:双引号。示例:"关键词"
  • 逻辑与:空格。示例:关键词1 关键词2
  • 逻辑或:空格OR空格。示例:关键词1 OR 关键词2
  • 逻辑非:空格-(减号前面必须是空格,减号后面没有空格,要紧跟着需要排除的词)。示例:关键词 -排除词
  • 模糊搜索:*(通配符,匹配任意词或短语)。示例:国家* 匹夫*
  • 指定网站:关键词 site:网站地址。注意:“site:”后面跟的站点域名,不要带“http://”。site:和站点名之间,不要带空格。示例: 编程教程 site:blog.csdn.net
  • 排除指定网站:关键词 -site:网站地址。示例:编程教程 -site:blog.csdn.net

设置/重映射快捷键

  1. PowerToysKeyboard Manager工具。

  2. 添加快捷方式,右键快捷方式-属性-快捷键。参考链接

    解决快捷键反应延迟问题:

    • Win10:win+s搜索后台应用-打开后台应用,将“设置“一栏关闭即可。参考链接
    • Win11:按下Win键打开开始菜单-所有应用-找到“设置”-右键-更多-应用设置-后台组件权限:从不(默认为电源已优化(推荐))。参考链接

下载

  • Windows系统下也可以运行Linux系统下的*.sh脚本/命令。网上有解决办法,例如;或者把shell脚本语言转为Powershell脚本语言。

    • 在Powershell下使用Invoke-WebRequest命令下载文件很慢。网上有解决方法,例如
    • Powershell下可以使用wgetcurl等命令。
  • 使用IDM、迅雷等下载器。

    • IDM

      • 优点:(分块)下载速度快(比浏览器默认下载快);定时下载;(使用通配符)添加批量任务;运行站点抓取;资源嗅探

      • 缺点:收费;(大文件)分块下载后合并下载块慢(解决:设置单线程下载;下载的临时文件夹和“保存至”文件夹不要在同一块硬盘上;高配电脑(CPU和SSD))

        • 改成单线程的话,该文件下载速度会变慢。当然,如果你同时下载许多个文件,那么可以这么做,不影响。
        • 同盘剪切一定快于跨盘剪切,但同盘复制一般慢于跨盘复制。
    • 迅雷

      • 优点:定时下载;下载速度快
      • 缺点:国产软件……想要速度快需要开会员

.github文件夹

.github 文件夹通常包含 GitHub 特定的配置文件和工作流。以下是一些常见的用途:

  • GitHub Actions Workflows: 自动化构建、测试和部署脚本,通常存放在 .github/workflows 目录下。
  • Issue 和 Pull Request 模板: 自定义 issue 和 pull request 的模板,通常存放在 .github/ISSUE_TEMPLATE.github/PULL_REQUEST_TEMPLATE.md 文件中。
  • CODEOWNERS 文件: 指定项目中某些文件或目录的负责人,通常存放在 .github/CODEOWNERS 文件中。
  • FUNDING 文件: 为项目设置资助选项,通常存放在 .github/FUNDING.yml 文件中。
  • 社区健康文件: 包括 CONTRIBUTING.md、CODE_OF_CONDUCT.md 等文件,帮助社区成员了解项目的贡献指南和行为守则。

这些文件和配置帮助项目维护者和贡献者更好地协作和管理项目。

中英文版本的简称

当描述一个文件是中文版本时,通常使用的语言代码有几种不同的形式,主要取决于具体的语境和标准。最常见的是“zh”,这是ISO 639-1标准下的代码,用于表示中文。然而,如果需要指明具体是简体中文还是繁体中文,人们可能会使用“zh-CN”(中国大陆使用的简体中文)和“zh-TW”(台湾地区使用的繁体中文)。这些是基于IETF语言标签(由ISO 639和ISO 3166国家代码组合而成),广泛用于网站和软件本地化中。

对于英文版本,通常使用的语言代码为“en”,这同样遵循ISO 639-1标准。如需进一步区分不同地区的英语,例如美国英语和英国英语,则分别使用“en-US”和“en-GB”。

这些缩写在多语言处理、软件本地化、网页语言标签等方面非常重要。选择正确的代码有助于正确设置语言环境,确保内容正确呈现给目标用户群体。如果有更具体的用途,如编程、文件标签或其他,请提供详细信息,以便提供更精确的建议。

流程框图

绘制流程框图(流程图)时,形状的使用有一套特定的规则,这些规则帮助标准化流程描述,并使流程图对于阅读者更加直观易懂。以下是一些基本的形状以及它们在流程图中的应用规则:

  1. 椭圆形或圆形(起止符)
    • 用途:表示流程的开始和结束。
    • 规则:每个流程图通常以一个圆形开始(标有“开始”或特定的启动指示),并以一个圆形结束(标有“结束”或特定的结束指示)。
  2. 矩形(处理步骤)
    • 用途:表示一个具体的操作或指令。
    • 规则:矩形内部应清晰地描述步骤的内容。每个矩形应该包含一个动作动词,明确指示执行的操作。
  3. 菱形(决策符)
    • 用途:表示需要做出决策的点,通常涉及是/否或者多重选择。
    • 规则:菱形中应包含一个简洁的问题或决策点,出口流向应标有可能的答案或选择,如“是”或“否”。
  4. 平行四边形(输入输出符)
    • 用途:表示数据的输入或输出。
    • 规则:必须明确指出数据的输入源或输出去向。例如,用户输入、数据保存等。
  5. 箭头
    • 用途:表示控制流程的方向。
    • 规则:箭头从一个符号指向另一个符号,显示流程的流向。保持箭头清晰,避免过多交叉,以免图表混乱。
  6. 圆角矩形(子程序)
    • 用途:如果流程图中某个操作是复杂的并在其他位置有详细描述,可以使用圆角矩形表示这是一个子过程。
    • 规则:子程序通常有对应独立的流程图说明详细步骤。

流程图的绘制还应遵守一些基本的布局规则,例如:

  • 清晰性:图表应清晰易读,避免过度复杂的连接。
  • 简洁性:只包含完成目标所需的必要步骤,避免冗余。
  • 一致性:使用统一的符号和术语。

在绘制流程图时,使用这些形状按照规则确保你的图表不仅标准化而且功能性强,能够清楚地传达流程信息。

其它

  1. Anaconda Prompt与Anaconda PowerShell Prompt与系统cmd与powershell的区别:

    • cmd
      • 优点:无
      • 缺点:Python不行;ls不行
    • Powershell
      • 优点:ls
      • 缺点:Python不行
    • Anaconda Prompt
      • 优点:Python 行
      • 缺点:ls不行
    • Anaconda Powershell Prompt【完美】
      • 优点:Python 行、ls
      • 缺点:无
  2. 导入环境变量:搜索“环境变量”——新建。

  3. 在 Windows PowerShell 终端中打开当前终端所在的文件夹:

    1
    explorer .
  4. 等等。

软件

CLion

快捷键

自定义快捷键:设置-按键映射

快捷键 作用
搜索
Shift + Shift 全局搜索;搜索得更全,不光包括文件文本内容,还有文件夹名称,操作等
CTRL+SHIFT+F 搜索整个工程或指定目录 注:连续按两次Esc,搜索框就会消失;专注搜索文件文本内容
CTRL+SHIFT+R 全局搜索+替换
Ctrl+Shift+A 查找(想要进行的)操作
ALT+F1 导航,查找文件所在目录位置
CTRL+F 在当前窗口查找文本
CTRL+R 在当前窗口替换文本
Ctrl+E 最近的文件
Ctrl+Shift+E 最近的位置,支持键盘直接输入模糊搜索。
Alt + 1 打开/关闭项目树
Alt + Shift + 1 在项目树定位打开的文件的位置
Ctrl + Tab 跳转标签页
查看
Ctrl+鼠标左键 前往声明或用法
Ctrl+鼠标右键 高亮当前区域(Rainbow Brackets插件)
Ctrl+P 将文本光标置于方法调用的圆括号之间,按Ctrl+P可以显示有效形参的列表。
Alt+Q 显示上下文信息(在函数内部快速查看函数定义)
文本编辑
Shift+Home/End 选中行中鼠标前面(后面)的全部内容
Alt+M String Manipulation(插件,字符串编辑)
Ctrl+C/X 复制/剪切整行
Ctrl+Y 删除整行
Ctrl+Alt+Enter 在上一行插入空行
Ctrl+D 重复行或选区
Ctrl+Shift+上/下箭头 向上/下移动语句
Ctrl+Shift+U 切换大小写
Shift+Alt+U CamelCase(插件,一键转化变量为驼峰命名或下划线命名)
Ctrl+Shift+J 合并行
代码自动提示和补全 上下方向键选择,Enter插入
光标前/后移动一个整词 Ctrl+<-/->
连续选中 Shift+<-/->
整词选中 Ctrl+Shift+<-/->
移动定位
Ctrl+Shift+N 转到文件
Ctrl+E 最近的文件
CTRL+上/下箭头 代码向上/下滚动(类似鼠标滚动)
ATL+上/下箭头 上一个/下一个变量/函数(方法)
ALT+Shift+←/→; 鼠标侧面的两个前进和后退键 返回/前进上次光标所在的位置
CTRL+HOME/END 光标跳转到第一行或最后一行下
Alt+←/→ 上/下一个标签页
F4 跳转到源文件
Ctrl+G 跳转到行/列
结构 工具栏-导航
Ctrl+F12 文件大纲
Alt+Shift+H/右边栏-层次结构 查看引入/包含文件的文件有哪些
Ctrl+Alt+Shift+2 在资源管理器里打开文件所在的特定上级文件夹
Ctrl+NumPad-/NumPad+ 折叠/展开代码/文件夹
撤回
CTRL+Z 倒退
CTRL+SHIFT+Z 向前
缩进与注释
CTRL+ALT+I 自动缩进
CTRL+/ 注释// 添加或删除注释
CTRL+SHIFT+/ 注释/*...*/
在函数名称上面一行输入/*!(或者////***) 然后回车,即可自动生成注释。
Translation翻译
Ctrl+Shift+Y 光标在单词上或选中单词
Ctrl+Shift+O 打开翻译界面
其他
Ctrl+F4/ESC 关闭当前文件
按住 Alt 点击关闭标签页 关闭其他标签页
Ctrl+D 比较文件差异。按F4跳转到源文件。直接点击<<是在同行直接接受,Ctrl+点击是换行插入。
F7 转到下一个差异
Shift+F6 (批量)重命名

小技巧

查找用法

查找函数被调用的位置:

函数名-右键-查找用法(Alt+Shift+7)。分为读取值(变量被赋值/数组被push/pop的地方)和声明或预声明(变量被用到的地方)。

函数名-右键-转到-声明或用例(Ctrl+B)/Ctrl+鼠标左键点击。

“重命名”重构

您可以轻松重命名类、函数、变量和文件,同时在所有引用中实现自动纠正。为此,将文本光标放在所需符号上,然后按Shift+F6(重构|重命名)。开始输入新名称并在准备好后按 Enter。

用语言结构包围代码块

CLion提供了标准模板,用于将代码片段用各种基于源代码语言的结构包围起来。这包括了if...else条件语句、do...whilefor循环、折叠区域和其他结构。

  1. 选择所需的代码片段。
  2. 从主菜单中选择Code | Surround With,或按Ctrl+Alt+T(与打开终端的全局快捷键冲突,可以改为Ctrl+Alt+W)。
  3. 从列表中选择必要的包围语句。

创建带有补全功能的代码结构

您可以使用语句补全创建代码结构。开始输入方法声明、方法调用或语句,例如 iffor do-whiletry-catchswitch-casereturn。按 Ctrl+Shift+Enter可以将语句补全为语法正确的结构。

代码-生成

代码生成选项。使用此菜单,可以快速生成构造函数/析构函数、 getter/setter、各种运算符和实现/重写函数。

快捷键:Alt+Insert

格式化

参考链接

您可以重新格式化部分代码、整个文件、文件组、目录和模块。您还可以从重新格式化中排除部分代码或某些文件。

重新格式化代码片段:

  1. 在编辑器中,选择要重新格式化的代码片段。如果您不选择代码片段,CLion 将重新格式化整个文件。
  2. (可选)预览:按 Alt+Enter 并单击调整代码样式设置。
  3. 格式化:在主菜单中,转到代码 |重新格式化代码 或 按 Ctrl+Alt+L 。

重新格式化行缩进:

在某些情况下,“设置”对话框中“缩进检测”部分中的“检测并使用现有文件缩进进行编辑”选项 ( Ctrl+Alt+S ) |编辑|代码样式可以覆盖您的设置。在这种情况下,CLion 将显示一条通知。

  1. 在编辑器中,选择必要的代码片段并按 Ctrl+Alt+I 。
  2. 如果需要调整缩进设置,请在“设置”对话框 ( Ctrl+Alt+S ) 中,转到编辑器 | 缩进设置-代码风格,选择您要更改缩进的语言。
  3. 在“制表符和缩进”选项卡上,指定适当的缩进选项,然后单击“确定”。

重新格式化文件:

  1. 在编辑器中打开文件并按 Ctrl+Alt+Shift+L 或在项目工具窗口中右键单击该文件并选择重新格式化代码。
  2. 在打开的“重新格式化文件”对话框中,如果需要,请选择以下重新格式化选项:
    • 优化导入:如果您想要删除未使用的导入、添加缺失的导入或组织导入语句,请选择此选项。
    • 代码清理:选择此选项可运行代码清理检查。
    • 不保留换行符:根据代码样式设置重新格式化换行符。此选项会覆盖重新格式化时保留 |换行符设置。
  3. 单击运行。如果您想查看重新格式化期间对代码所做的确切更改,请使用本地历史记录功能。

在保存时自动格式化代码:设置-工具-保存时的操作:重新格式化代码

书签(快捷跳转)

  • 添加无名行书签:在编辑器中,将光标定位在一行代码上,然后按下 F11 键。或者,右键单击要添加书签的代码行旁边的装订线,然后选择“添加书签”。
  • 添加助记符行书签:在编辑器中,将光标定位在一行代码上,然后按下 Ctrl+F11 键。或者,右键单击要添加书签的代码行旁边的装订线,然后选择“添加助记符书签”。在打开的弹出窗口中,选择一个数字或字母作为此书签的标识符。或。直接按下Ctrl+Shift+Num直接添加。
  • 书签文件和文件夹:在项目工具窗口(Alt+1)中,右键单击要添加书签的项目,然后选择“书签” | “添加书签” (F11) 或 “添加助记符书签” (Ctrl+F11)。要为多个项目添加书签,请在工具窗口中选择它们,右键单击其中一个,然后选择“书签” | “添加书签” (F11)。对于助记符书签,选择一个数字或字母作为此书签的标识符。按 Enter 键或再次单击所选的字母或数字以保存书签。
  • 删除书签。再次按下F11
  • 重命名书签:在装订线上单击书签图标,然后提供新的描述。
  • 书签跳转。按住 Ctrl 键,然后按键盘上的数字助记符。或,按下 Shift+F11 键,或者从主菜单中选择“编辑” | “书签” | “显示行书签”。或,转到下一个或上一个书签:“编辑” | “书签” | “上/下一行书签”。
  • 所有的书签都分组在“书签”工具窗口中的列表中,您可以通过从主菜单选择“视图 | 工具窗口 | 书签”或按下 Alt+2 来打开它。您可以快速添加所有打开的文件的书签,并将这些书签添加到新列表中。

扩展代码选区(鼠标选择的区域)

要展开选区,请按Ctrl+W。每次按 Ctrl+W时,选区将扩展到代码的其他区域。例如,选区从一个方法名称扩展到调用此方法的表达式,然后扩展到整个语句,继而扩展到包含的块,等等。缩减选区:Ctrl+Shift+W。

导入缺失的头文件/函数声明

  • 配置自动导入。您可以在“设置 | 编辑器 | 通用 | 自动导入”中为C/C++和其他语言配置自动导入行为。
  • 对于提示找不到/未定义的变量/函数,选中,按下Alt+Enter
  • 在cpp文件中编写函数定义后,在函数名上按Alt+Enter组合键,然后选择“创建新函数/split function into declaration and definition”。这将在头文件中添加Class声明。
    1. 在CLion中打开源代码文件。
    2. 在代码中编写类的定义,并保存该文件。
    3. 右键单击源代码文件,选择“Refactor(重构)”,然后选择“Extract”。
    4. 在弹出的对话框中选择“Declaration”,然后选择“Extract”。
    5. 在新的头文件中,你可以看到类的声明已经被自动生成了。

从索引中排除

CLion为项目文件建立索引,以启用诸如搜索,导航,代码完成,代码生成和重构之类的功能。但是,您的项目可能包含不需要这些功能的文件,例如日志,二进制文件或导入的库。在这种情况下,为了减少索引时间,可以将文件标记为纯文本 ,将目录标记为排除或库。

临时文件

有时候您可能需要在项目上下文之外创建临时的笔记或者起草一些代码。而不必切换到不同的应用程序,您可以使用临时文件和临时缓冲区。

临时文件和缓冲区与特定项目无关。它们对于任何在特定IDE实例中打开的项目都是可用的。

创建临时文件:

  1. 从主菜单中选择 File | New | Scratch File,或者按下 CtrlAltShiftInsert。另外,可以在项目工具窗口中,右键点击任何区域,然后导航到 New | Scratch File。
  2. 选择临时文件的语言。相同类型的临时文件会自动编号,并添加到项目视图的 Scratches and Consoles 目录中。
  3. 另外,您可以根据当前编辑器中的选中内容创建一个新的临时文件。选择一些文本或代码,按下 Alt+Enter,然后选择 Create new scratch file from selection。CLion将尝试检测选中片段的语言,并使用适当的类型和扩展名。如果它无法检测出选中片段的语言,CLion将使用与原始文件相同的类型和扩展名创建文件。

临时文件和缓冲区的位置:默认情况下,CLion会将临时文件和缓冲区存储在 IDE配置目录 下的 scratches 目录中。它们可以在任何使用此配置目录的IDE和项目中使用。

1
2
3
4
5
6
# Windows:
%APPDATA%\JetBrains\<product><version> # C:\Users\JohnS\AppData\Roaming\JetBrains\CLion2023.2
# macOS
~/Library/Application Support/JetBrains/<product><version> # ~/Library/Application Support/JetBrains/CLion2023.2
# Linux
~/.config/JetBrains/<product><version> # ~/.config/JetBrains/CLion2023.2

将临时文件包含到您的项目中:如果一个临时文件变得足够大,以至于您希望在项目中使用它,可以将它移动到项目结构的所需目录中。

  1. 在编辑器中打开一个临时文件,或者在项目视图中的 Scratches and Consoles | Scratches 目录中选择它,按下 F6,然后选择项目中的目标目录。
  2. 在项目视图的 Scratches and Consoles | Scratches 目录中,将临时文件从源目录拖到项目中的目标目录。
  3. 在项目视图的 Scratches and Consoles | Scratches 目录中选择一个临时文件,按下 Ctrl+X,然后选择项目中的目标目录,按下 Ctrl+V。

其它

  1. 右键标签页-向下拆分/向右拆分:方便看大型内容。

Conda

在没有自行安装其他的conda环境的时候,默认会有一个base环境。

这里的*表示,这个是当前处于激活状态的环境。每次进入conda的时候,默认就是进入了base环境。

库都要安装在小环境中,不要安装在 base 里, 首先要用 conda 激活环境。

查询

1
2
3
4
5
6
7
8
9
conda --help  # 查询 conda 的命令
conda --version # 查看当前 conda 的版本
# 环境管理
# 查看所有的conda环境
conda env list # 或
conda info --envs
# 查看当前环境
conda info -e # 查看当前环境是哪个
conda info # 查看当前环境的完整信息

mamba

除了激活和退出环境仍需要 conda 命令,安转和搜索包都可以使用 mamba 替换 conda,以提高速度。

1
2
# 安装 mamba
conda install mamba -n base -c conda-forge

环境管理

1
2
3
4
5
6
conda create -n cpp_test_env  # 创建环境
# conda create -n cpp_test_env python=3.6
conda activate cpp_test_env # 激活环境,激活成功会出现一个小括号(环境名字,cpp_test_env)
conda deactivate # 退出环境,后面不需要加环境的名字
conda clean (参数) # 清空缓存
conda remove -n env_name --all # 删除环境,有一个参数

Windows:

1
2
3
4
5
6
# conda默认使用了hardlink,如果同时使用conda和pip的情况下,我个人建议加上 --copy 选项
conda create --copy -n envname python=3.9
# 打开新建环境下的lib文件夹的site.py文件(C:\Users\username\.conda\envs\conda_env\Lib\site.py), 找到USER_SITE、USER_BASE那两行, 默认是None, 修改后如下:
USER_SITE = r"C:\Users\username\.conda\envs\conda_env\Lib\site-packages"
USER_BASE = r"C:\Users\username\.conda\envs\conda_env\Scripts"
# 记得加上r抑制转义, 否则有可能因为非法转义报错, 导致进入不了虚拟环境。

可以通过配置auto_activate_base关闭自动进入conda基础环境:

1
conda config --set auto_activate_base false

如要开启,将其设为true就可以了:

1
conda config --set auto_activate_base true

库/包管理

清华源:https://pypi.tuna.tsinghua.edu.cn/simple

阿里源:https://mirrors.aliyun.com/pypi/simple/

腾讯源:http://mirrors.cloud.tencent.com/pypi/simple

豆瓣源:http://pypi.douban.com/simple/

  1. 安装包

    1. 在线安装

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      conda search qt  # 搜索可用版本
      # 你可以指定所安装软件包的版本号,如果不指定的话,就默认安装最新版本。
      conda install -y pkgs[==version] # 安装库,安装成功一般会出现三个 done 。-y 参数的作用是自动确认,忽略询问。
      # 通过调用软件的帮助文档来经常是否下载成功。如果失败, 重新下载即可。

      # 或
      # 在anaconda下用pip装包的原因:尽管在anaconda下我们可以很方便的使用conda install来安装我们需要的依赖,但是anaconda本身只提供部分包,远没有pip提供的包多,有时conda无法安装我们需要的包,我们需要用pip将其装到conda环境里。
      conda install pip # 进入环境后
      # 首先用下面命令查看我们此时用的pip为哪个环境
      # 如base环境的pip可能在/root/anaconda3/bin/pip,而其他conda环境的pip,可能在/root/anaconda3/envs/my_env/bin/pip
      which -a pip
      pip -V # pip --version
      # 配置
      pip -v config list
      pip install --upgrade pip setuptools wheel # 升级pip工具包
      pip install --upgrade pip # 更新 pip 至最新版
      pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 永久换源(清华源)
      # Writing to /home/xxx/.config/pip/pip.conf
      # global.index-url='https://pypi.tuna.tsinghua.edu.cn/simple'
      pip config unset global.index-url # 换回默认源
      # 搜索可用版本
      pip index versions [your python module name] # 或
      pip install package_name==
      pip install pkgs[==version] # pip安装的包,conda list结果中的build项目的Channel为pypi
      pip install -r environment.txt # 根据 txt 文件创建使用 pip 安装的环境
      pip3 --proxy 127.0.0.1:7890 install package_name
      pip install xxxx -i https://pypi.tuna.tsinghua.edu.cn/simple # 临时换源(清华源)
      pip install geometry_msgs --extra-index-url https://rospypi.github.io/simple # 临时添加额外的源
      pip install -e path/ # 执行path/目录下的setup.py文件
    2. 本地安装

      1
      2
      3
      # https://anaconda.org/这个是Anaconda包下载的地方,利用搜索框进行搜索,然后下载。
      conda install --use-local package.tar.bz2 # 安装本地软件包。
      pip install path/package_name.whl
  2. 查找包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查找软件常用的链接(我们认知的软件名和conda给的名字不一样)
    # https://bioconda.github.io/
    # https://anaconda.org/search
    conda search 软件名 # 查找库

    # 查看环境中所装的包
    conda list # 默认当前环境
    conda list –n cpp_test_env # 查看指定环境
    conda list fast* # 比如很早就安装某个软件,如果只想起四个字母,用通配符的去查找
    pip show packagename
  3. 更新与卸载包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 更新
    conda update name # 更新库
    pip install --upgrade 包名称==版本号
    pip install package_name== # 会自动卸载旧版本

    # 卸载
    # --force 确保只卸载该库,而不同时卸载该库的其他库
    conda uninstall pytorch --force # 卸载使用 conda 安装的库
    conda remove name # 与上命令等同
    pip uninstall torch # 卸载使用 pip 安装的库

环境移植

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 方法一:克隆环境
conda create -n 新环境名 --clone 旧环境名 # 克隆环境

# 方法二:导出环境
conda env export > environment.yml # 导出使用 conda 安装的环境,在当前目录下生成一个名为 enviroment.yml 的文件
conda env create -f environment.yml # 根据 yml 文件创建使用 conda 安装的环境
# 如果创建环境中途遇到了报错,希望继续创建,可以:
conda activate environment_name # 激活已经部分创建的环境
conda env update --file environment.yml --prune # 继续安装剩余的依赖。--prune选项会移除不在environment.yml文件中的包。
# 在用 conda 的时候发现有些module还是未安装,上网找了下原因,原来以上只会导出conda命令直接安装的包,而我的包大多是用pip安装在Anaconda的lib和site-package里了。因此还要用导出pip的方法:
pip freeze > environment.txt # 导出使用 pip 安装的环境,在当前目录下生成一个名为 environment.txt 的文件
pip install -r environment.txt # 根据 txt 文件创建使用 pip 安装的环境

# 方法三:利用conda pack进行环境拷贝
# conda-pack包安装
# 利用conda进行conda-pack包安装
conda install -c conda-forge conda-pack
# 利用pip进行conda-pack包安装
pip install conda-pack

# 环境打包
# 打包环境,生成environment.tar.gz
conda pack -n enviroment
# 打包环境,生成defined_name.tar.gz
conda pack -n my_env -o defined_name.tar.gz
# 打包环境,使生成的environment.tar.gz置于[path]下
conda pack -p [path]

# 环境移植
# 首先要在conda安装目录下的envs文件夹下新建一个文件夹,这个文件夹的名称就是环境的名称,即在[path of conda]/envs/下
# 定位到conda下的envs文件夹下
cd envs
# 新建用于环境的
mkdir enviroment
# 将打包的环境重新恢复
tar -xzf enviromen.tar.gz -C enviroment

报错

在 shell 脚本中执行conda activate时报错:

1
CondaError: Run 'conda init' before 'conda activate'

加上conda init后还是报错。

解决:

确保 conda init 只在第一次运行时执行,并且在脚本中正确激活环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/zsh
set -e
# set -x

# 检查 conda 是否已经初始化
if ! grep -q "conda initialize" ~/.zshrc; then
conda init zsh
exec zsh # 重新启动 zsh 以应用更改
fi

# 激活 conda 环境
source ~/.zshrc
conda activate evo

# 你的其他命令

CTEX

  1. 创建通栏:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    \onecolumn
    % 通栏图片/表格
    \begin{multicols}{2}
    % 继续双栏内容
    \end{multicols}
    \onecolumn
    % 通栏图片/表格
    \begin{multicols}{2}
    % 继续双栏内容
    \end{multicols}

Git

Windows下的Git Bash终端快捷键:

快捷键 作用
Ctrl+insert 复制
Shift+insert 粘贴

GitHub

  1. star的原则:

    如果项目完善已停止更新或目前没有使用,就没有star的必要,来“污染”star库。star主要用于及时获取更新消息和收藏常用项目。

    1. 项目仍在持续更新。
    2. 感兴趣(但还没有深入研究)的项目(更推荐收藏在浏览器收藏夹中,还能做备注)。
  2. 默认watch:Participating and @mentions

  3. 根据Tag找存储库的历史版本:

    1
    2
    3
    GIT_REPOSITORY  https://github.com/jbeder/yaml-cpp
    GIT_TAG 11607eb5bf1258641d80f7051e7cf09e317b4746
    https://github.com/jbeder/yaml-cpp/tree/11607eb5bf1258641d80f7051e7cf09e317b4746
  4. 在GitHub上快速找到自己评论过或者发布过的问题:

    1
    2
    3
    4
    5
    6
    # 搜索框
    commenter:username
    is:issue commenter:username
    is:issue involves:username
    is:issue is:open # is:issue is:closed
    # 要查看最近的活动,请从Sort下拉列表中选择Recently updated
  5. GitHub首页只会推荐有最新releasestar项目?如果想跟进项目的commit,可以在Your stars界面筛选Sort by: Recently active

  6. 每日/周/月排行:点击GitHub首页左上角三道杠-Explore-Trending

  7. 搜索:

    1
    2
    java stars:>1000  # 目标语言是java且star数大于1k
    dvs_msgs language:Python # 指定编程语言

Google Colab

  1. Google上传和解压:

    选中谷歌云端硬盘里的文件,右键-共享-共享-设置访问权限:知道链接的任何人。共享-复制链接:

    1
    2
    3
    4
    5
    6
    # https://drive.google.com/file/d/xxx/view?usp=drive_link
    !gdown --id 'xxx' --output file.zip
    !unzip file.zip -d /content/file
    %cd /content/file
    !pwd
    !ls
  2. 查看硬件信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    print("============查看GPU信息================")
    # 查看GPU信息。注意提前把代码执行程序改为GPU。
    !/opt/bin/nvidia-smi
    print("==============查看pytorch版本==============")
    # 查看pytorch版本
    import torch
    print(torch.__version__)
    print("============查看虚拟机硬盘容量================")
    # 查看虚拟机硬盘容量
    !df -h
    !df -lh
    print("============查看cpu配置================")
    # 查看cpu配置
    !cat /proc/cpuinfo
    print("=============查看内存容量===============")
    # 查看内存容量
    !cat /proc/meminfo

Mermaid

GitHub仓库

官网

中文网

Typora支持图表绘制

通用语法

流程图的方向定义:

  • TB - 从上到下
  • TD - 自上而下/与自上而下相同
  • BT - 从下到上
  • RL - 右到左
  • LR - 左到右

流程图

简单示例:

flowchart TD
    A[Enter Chart Definition] --> |Text| B(Preview)
    B --- C{decide}
    C -.-> D([Keep])
    C ==> E[Edit Definition]
    E  <--> B
    D --> F[Save Image and Code]
    F --> B
    
    markdown["`This **is** _Markdown_`"]
    newLines["Line1
    Line 2
    Line 3"]
    markdown --> newLines

Microsoft Edge

Microsoft Edge 中的键盘快捷方式

快捷键 作用
窗口
Ctrl+N 新建窗口
Ctrl+Shift+N 新建无痕窗口
标签页
Ctrl+W 关闭当前标签页
Ctrl+Shift+W 关闭所有标签页
Ctrl+Shift+A 查看最近关闭的标签页
Ctrl + Shift + K 复制当前标签页
Ctrl + Tab 切换到下一个标签页
Ctrl + Shift + Tab 切换到上一个标签页
Ctrl + 1, 2, ... 8 切换到特定标签页
Ctrl + 9 切换到最后一个标签页
搜索
Alt + D/Ctrl + L/F4 选择地址栏中的 URL 以进行编辑
Ctrl + Shift + L 粘贴并搜索或粘贴并访问(不一定非得是URL)
Ctrl + E/Ctrl + K 在地址栏中打开搜索查询
Ctrl+Shift+E 在边栏中搜索
其它
F5 重新加载当前标签页
Ctrl+F/F3 查找当前标签页

Okular

快捷键 作用
F6 注释
Ctrl+4 文本选择工具
鼠标双击 打开注释/持续选择工具

TeXstudio

快捷键 作用
F5 编译并预览
F6 编译
Ctrl + F 可对源码或者PDF查看器的内容进行搜索定位
Ctrl + 鼠标单击 定位Latex源码和PDF的对应位置
Ctrl + T 注释选定代码
Ctrl + U 取消选定代码注释

其他配置:

  1. 选项-设置-构建:若写中文论文,则需修改默认编译器为XelaTeX;若为英文,则用PdfLaTex。

Typora

Markdown语法

https://support.typoraio.cn/zh/Markdown-Reference/

语法高亮

  • Shell: console, shell
  • Bash: bash, sh, zsh
  • Powershell: powershell, ps
  • Dos: dos, bat, cmd
  • language: js、javascript、java、python、c、c#、c++
  • html、htmlbars、yaml、xml、json
  • typescript、sql、nginx
1
2
3
4
sudo apt upgrade  # 安装可用的软件包更新
`高亮`
```高亮```
#! 执行

脚注

1
2
3
您可以像这样创建脚注[^footnote].

[^footnote]: Here is the *text* of the **footnote**.

快捷键

快捷键 作用
Ctrl+T 插入表格
Ctrl+Enter 表格插入行
Ctrl+Shift+Backspace 删除行
Ctrl+Shift+L 显示/隐藏边栏
Ctrl+Shift+1 显示/隐藏大纲
Ctrl+/ 源代码模式
Ctrl+K 复制链接,在Typora中选中要建立超链接的文字,按下Ctrl+K,Typora会自动读取剪切板来创建超链接。
Ctrl+Shift+` 生成代码格式,也就是使用````进行包围
Ctrl+Y 重做(与Ctrl+Z撤销相反)
Ctrl+Shift+F 当前目录下的文件全局搜索
Ctrl+L 全选行

小贴士

  1. 有序列表回车后按再按回车:取消缩进,回到行首,取消继续编号;按 TAB,新建下级列表;按Backspace ,取消继续编号,可在保持缩进的情况下输入内容。
  2. 在列表中第一次回车,取消当前列表,第二次回车,创建上级列表(没有上级列表就是正文的回车)。

vim

参考链接

vim键盘图

vi/vim的使用

1
vim runoob.txt  # 开始使用vim编辑文件

基本上 vi/vim 共分为三种模式,命令模式(Command Mode)输入模式(Insert Mode)底线命令行模式(Command-Line Mode)

命令模式

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。

以下是普通模式常用的几个命令:

  • i:切换到输入模式,在光标当前位置开始输入文本。
  • ::切换到底线命令行模式,以在最底一行输入命令。
  • x:删除当前光标所在处的字符。
  • a:进入插入模式,在光标下一个位置开始输入文本。
  • o:在当前行的下方插入一个新行,并进入插入模式。
  • O:在当前行的上方插入一个新行,并进入插入模式。
  • dd:剪切当前行。
  • yy:复制当前行。
  • p(小写):粘贴剪贴板内容到光标下方。
  • P(大写):粘贴剪贴板内容到光标上方。
  • u:撤销上一次操作。
  • Ctrl + r:重做上一次撤销的操作。

若想要编辑文本,只需要启动 Vim,进入了命令模式,按下 i 切换到输入模式即可。

在其它模式下,可以随时按ESC键回到命令模式

命令模式只有一些最基本的命令,因此仍要依靠底线命令行模式输入更多命令。

输入模式

在命令模式下按下 i 就进入了输入模式,使用 Esc 键可以返回到普通模式。

在输入模式中,可以使用以下按键:

  • 字符按键以及Shift组合:输入字符
  • ENTER:回车键,换行
  • BACK SPACE:退格键,删除光标前一个字符
  • DEL:删除键,删除光标后一个字符
  • 方向键 ↑↓←→:在文本中移动光标
  • HOME/END:移动光标到行首/行尾
  • Page Up/Page Down:上/下翻页
  • Insert:切换光标为输入/替换模式,光标将变成竖线/下划线
  • ESC:退出输入模式,切换回命令模式

底线命令行模式

在命令模式下按下 :(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有:

  • :w:保存文件但不退出。
  • :q:退出 Vim 编辑器。
  • :wq:保存文件并退出 Vim 编辑器。
  • :q!:强制退出Vim编辑器,不保存修改。
  • :w!:若文件属性为【只读】,强制写入该档案
  • :wq!:强制保存后退出。
  • :e!:将档案还原到最原始状态!

ESC 键可随时退出底线命令行模式,切换回命令模式

vi/vim按键说明

vi/vim按键说明

VSCode

快捷键

官方文档

(当快捷键冲突时,)您可以通过导航到文件 -> 首选项 -> 键盘快捷键(Ctrl+K, Ctrl+S)并在搜索栏中搜索“导航”来更改首选键绑定。

作用 快捷键 自定义
Linux Windows
一般
首选项:打开设置(ui) Ctrl+, Ctrl+Alt+S
控制台终端显示与隐藏 ctrl + ~
显示所有符号 Ctrl + T
全局搜索 Ctrl+Shift+F
查找 Ctrl + F
替换 Ctrl + H
最近打开的项目(文件夹) Ctrl+P
通过文件名查找文件(快速打开最近的文件) Ctrl+E
打开命令面板(通过搜索界面访问 VS Code 中存在的所有可用命令、快捷方式和功能) Ctrl + Shift + P
跳转标签页 Ctrl + Tab
关闭文件 Ctrl+W Ctrl+F4
关闭所有文件 Ctrl + K, W
显示/隐藏侧边栏 Ctrl+B Alt+1
显示/隐藏终端 Ctrl+`
打开文件所在文件夹/文件:在文件资源管理器中显示 Ctrl + Alt + R Shift+Alt+R Alt + F1,when editorFocus
复制文件名(插件 Copy file name Ctrl + Alt + E
移动
向上/向下滚动行 Ctrl+↑ / ↓
快速滚动 滚动时按住 Alt 键可以以 5 倍速度滚动;此外,您还可以使用编辑器:快速滚动灵敏度 ( editor.fastScrollSensitivity ) 设置更改滚动倍数。
快速回到顶部 ctrl + home
快速回到底部 ctrl + end
前进(编辑位置) Ctrl+Shift+- Alt+<- Alt + Shift + ->
后退(编辑位置) Ctrl+Alt+- Alt+-> Alt + Shift + <-
转到行/列 Ctrl+G
注释与缩进
单行注释 [ctrl+k,ctrl+c] 或 ctrl+/
取消单行注释 [ctrl+k,ctrl+u] (按下ctrl不放,再按k + u)
多行注释 [alt+shift+A]
行增加缩进 ctrl + [
行减少缩进 ctrl + ]
多行注释 /**
文本编辑
向上/下复制行 Ctrl+Shift+Alt+↑ / ↓ Shift+Alt+↑/↓ Ctrl+D
向上/下移动行 Alt + ↑ / ↓ Ctrl+Shift+↑ / ↓
选择当前行 Ctrl+L
删除整行 Ctrl + Shift + K Ctrl+Y
缩小/扩大选区:收起/展开选择:扩大/缩小选区 Shift+Alt+<-/-> Ctrl+(Shift)+W
代码格式化 当前选择的源代码: Ctrl+K Ctrl+F;整个文档格式:Ctrl+Shift+I 当前选择的源代码: Ctrl+Alt+L
重命名符号 选择一个符号,然后键入 F2
光标前/后移动一个整词 Ctrl+<-/->
连续选中 Shift+<-/->
整词选中 Ctrl+Shift+<-/->
用语言结构包围代码块 (插件:Surround)Ctrl+Shift+T Ctrl+Alt+W
重命名符号/文件(夹) F2
选择特定区域 第一个位置鼠标单击,第二个位置按住Shift再单击
查看
查看和跳转符号 Ctrl+Shift+O
转到工作区中的符号(Latex 标签、章节) Ctrl+T
跳转到函数开头 Ctrl+Shift+O,后直接按Enter
跳转到函数结尾 Ctrl+Shift+O,后按↓,后按Enter
查看用法 Ctrl+Shift+F10
转到定义 选择一个符号,然后键入 F12;Ctrl+单击;Shift+F12,小窗浏览定义
查找所有引用 Alt+Shift+F12 Alt+Shift+7
差异跳转 F7 和 Shift+F7
将文件与剪贴板进行比较 Ctrl+K C
转到括号(在所属最近的成对括号间来回跳转) Ctrl+Shift+\
全屏 F11 Shift+F11
编辑器
打开上一个编辑器 Ctrl+PageUp
打开下一个编辑器 Ctrl+PageDown
打开组中最后一个编辑器 Ctrl+9
书签
书签:插入/删除 Ctrl+Alt+K F11
书签:跳至上一个 Ctrl+Alt+J
书签:跳至下一个 Ctrl+Alt+L Ctrl+Alt+K
书签:将选择展开到上一个 Shift+Alt+J
书签:将选择展开到下一个 Shift+Alt+L
书签:收缩选择 Shift+Alt+K
LaTeX Workshop
使用配方构建 Ctrl+Alt+R
查看 LaTeX PDF 文件 Ctrl+Alt+V
其它
CMake: 运行但不调试 Ctrl+F5
更改颜色主题 Ctrl+K Ctrl+T
聊天,在侧边栏打开聊天 Alt+3

小技巧

新建文件(夹)

  • 鼠标双击左侧“文件夹”空白处,后输入:

    1
    2
    3
    test.py  # 新建文件
    test/ # 新建文件夹
    test/test.py # 新建文件夹内的文件
  • 双击标签栏

  • Ctrl + N 键盘快捷键

  • 命令面板(Ctrl+Shift+P) - Create: New File

  • 单击文件资源管理器窗格中的New File...图标按钮

  • 文件 > 新建文件

用户代码片段/实时模板

左下角设置-用户代码片段

VS Code的代码片段填充功能默认使用的是Tab键,而不是空格键或回车键。并且,这个行为是不能被修改的。当你在一个代码片段中,你可以使用Tab键在不同的位置(被${1}, ${2}等标记的位置)之间跳转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{
// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"To //": {
"prefix": "、、",
"body": [
"// "
],
"description": "中文注释符号转英文"
},
"TODO-LLL25655-//": {
"prefix": "// todo",
"body": [
"// TODO-LLL25655: "
],
"description": "TODO-LLL25655"
},
"NOTE-LLL25655-//": {
"prefix": "// note",
"body": [
"// NOTE-LLL25655: "
],
"description": "NOTE-LLL25655"
},
"BUG-LLL25655-//": {
"prefix": "// bug",
"body": [
"// BUG-LLL25655: "
],
"description": "BUG-LLL25655"
},
"DEBUG-LLL25655-//": {
"prefix": "// debug",
"body": [
"// DEBUG-LLL25655: "
],
"description": "DEBUG-LLL25655"
},
"XXX-LLL25655-//": {
"prefix": "// xxx",
"body": [
"// XXX-LLL25655: "
],
"description": "XXX-LLL25655"
},
"UNDO-LLL25655-//": {
"prefix": "// undo",
"body": [
"// UNDO-LLL25655: "
],
"description": "UNDO-LLL25655"
},
"FIXME-LLL25655-//": {
"prefix": "// fixme",
"body": [
"// FIXME-LLL25655: "
],
"description": "FIXME-LLL25655"
},
"HACK-LLL25655-//": {
"prefix": "// hack",
"body": [
"// HACK-LLL25655: "
],
"description": "HACK-LLL25655"
},
"TODO-LLL25655-#": {
"prefix": "# todo",
"body": [
"# TODO-LLL25655: "
],
"description": "TODO-LLL25655"
},
"NOTE-LLL25655-#": {
"prefix": "# note",
"body": [
"# NOTE-LLL25655: "
],
"description": "NOTE-LLL25655"
},
"BUG-LLL25655-#": {
"prefix": "# bug",
"body": [
"# BUG-LLL25655: "
],
"description": "BUG-LLL25655"
},
"DEBUG-LLL25655-#": {
"prefix": "# debug",
"body": [# FIXME-LLL25655:
"# DEBUG-LLL25655: "
],
"description": "DEBUG-LLL25655"
},
"XXX-LLL25655-#": {
"prefix": "# xxx",
"body": [
"# XXX-LLL25655: "
],
"description": "XXX-LLL25655"
},
"UNDO-LLL25655-#": {
"prefix": "# undo",
"body": [
"# UNDO-LLL25655: "
],
"description": "UNDO-LLL25655"
},
"FIXME-LLL25655-#": {
"prefix": "# fixme",
"body": [
"# FIXME-LLL25655: "
],
"description": "FIXME-LLL25655"
},
"HACK-LLL25655-#": {
"prefix": "# hack",
"body": [
"# HACK-LLL25655: "
],
"description": "HACK-LLL25655"
}
}

生成函数注释

  • 函数注释模板插件:

    • C++: Doxygen Documentation Generator

      • 设置:C_Cpp › Doxygen: Generated Style
    • Python: autoDocstring - Python Docstring Generator

  • GitHub Copilot: 选中函数,Ctrl+I打开内联聊天,输入/doc in Chinese

创建(函数)声明/定义

鼠标选中,右键“创建声明/定义”

改变大小写

change-case:快速更改当前选择或当前单词的大小写(camelCase、CONSTANT_CASE、snake_case 等)

选中单词,按下Ctrl+Shift+P搜索Change Case Commands...

当然,可以按Ctrl+K S搜索Change Case为特定命令设置快捷键。

多代码库编码的工作空间

10 amazing VS Code tips and tricks for rapid coding

想象一下必须在 3 个打开的 VS Code 窗口中来回切换的痛苦;到处打开终端,在错误的代码库中搜索错误的文件,将 Alt + Tab 序列与其他打开的应用程序混合在一起,以及每次切换应用程序时都会造成的精神混乱和延迟。

每个文件夹都是 VS Code 的一个工作区,因此您可以使用文件 > 将文件夹添加到工作区...轻松添加更多文件夹。

一切完成后,您将拥有所需的所有文件夹,并且可以在“文件资源管理器”窗格中轻松访问其中的文件。

当您使用 Ctrl + P 或 Ctrl + Shift + F 搜索文件时,它将应用于所有文件夹中的每个文件。

您还可以使用任何文件夹作为工作目录快速创建新终端。

矩形选择

在 Visual Studio Code 中,您可以通过以下步骤选择一个矩形的区域:

  1. 按住ShiftAlt键(在 macOS 上是ShiftOption键)。
  2. 同时拖动鼠标(鼠标分别点击开始和结束位置)以选择所需的矩形区域。

其它

  1. 在“资源管理器”视图中查看当前文件并输入 F2 或者 Enter 选择文件名文本:
    • 第一次按 => 选中文件前缀
    • 第二次按 => 选中文件全部
    • 第三次按 => 选中文件后缀
    • 第 4 次按下 => 循环回到前缀
  2. 等等。

Zotero

快捷键 作用
zotero-reference
单击蓝色区域 复制参考文献信息,连同标识符一起复制,如DOI。
双击顶部XX条参考文献文字 复制当前所有参考文献到剪贴板
长按蓝色区域 编辑参考文献信息。建议中文参考文献使用编辑功能以精简条目,提高导入成功率。
Ctrl+单击蓝色区域 用系统浏览器打开文献URL,偶尔会查询文献地址消耗一定的时间。
一般
ctrl+鼠标滚轮 放大/缩小
ctrl+鼠标左键在原文/译文之间自由切换 翻译

主阅读界面若有跳转链接如Fig 4,点击后会在分割界面(横向/竖向)跳转,主阅读界面无跳转,避免点击前进后退。可满足看图,公式,表格的需求。但只针对有跳转链接的PDF。

其它

3-2-1备份规则

3-2-1 备份策略

3-2-1 备份规则是一种简单、有效的策略,可确保数据安全。它建议您将数据的三份副本保存在两个不同的介质上,其中一份副本保存在异地。让我们来分解一下:

  • 数据的三份副本:您的三份副本包括原始数据或生产数据以及另外两份副本。
  • 两种不同的介质上:您应该将数据存储在两种不同形式的介质上。这在今天意味着与 2000 年代末有所不同。我稍后会详细讨论这一点。
  • 一份异地副本:您应该在异地远程位置保存一份数据副本,最好距离其他两份副本几英里远。

如果您想保护您的个人信息、照片、工作文件或其他重要数据,3-2-1 备份策略是您的最佳选择。它可以帮助您避免出现容易受到人为错误、硬盘驱动器崩溃、盗窃、自然灾害或勒索软件影响的单点故障。``


常用的命令及快捷键
http://zeyulong.com/posts/a8aab215/
作者
龙泽雨
发布于
2024年3月5日
许可协议