Loading...
墨滴

RFC

2021/04/16  阅读:99  主题:默认主题

ubuntu

​# ubuntu-1


ls *.tex and "ls *.tex"

前一种 bash 认为 *.tex 是参数,后一种 bash 认为 "ls *.tex" 是一个整体命令的名字.

bash 物理行上单个语句不用分号,两个语句并列时,采用分号.


如果用显式字符串作 cd 的参数,应该用绝对路径避免~的解析问题.如


cd  /home/tom/Downloads


whoami会输出用户的名称


bash -c command arg1 arg2 ...

这种调用形式,会读取 -c后面的command_string并执行命令,然后退出

如果在command_string之后有参数,则第一个参数分配给$0,其余所有参数分配给位置参数.

$0的赋值设置shell的名称,该名称用于warningerror消息.如


bash -c 'ls;echo;uptime'

日常

命令可以是下面四种形式之一:

  1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样.

属于这一类的程序,可以编译成二进制文件,诸如用 CC++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等.

  1. 是一个内建于 shell 自身的命令.bash 支持若干命令,内部叫做 shell 内部命令 (builtins).例如,cd

令,就是一个 shell 内部命令.

  1. 是一个 shell 函数.这些是小规模的 shell 脚本,它们混合到环境变量中. 在后续的章节里,我们将讨论配

置环境变量以及书写 shell 函数.但是现在, 仅仅意识到它们的存在就可以了.

  1. 是一个命令别名.我们可以定义自己的命令,建立在其它命令之上

oh_my_zsh

查看或设置主题


_omz::theme list agnoster

_omz::theme set agnoster

更新 omz


_omz::update


powerline

Powerline is a statusline plugin

Installation on Linux

get the latest release version


pip install --user powerline-status

常用命令

  • type – 说明怎样解释一个命令名

  • which – 显示会执行哪个可执行程序

  • man – 许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页(man page).一个特殊的叫做man 的分页程序,可用来浏览他们

  • apropos - 显示适当的命令,基于某个关键字的匹配项.虽然很粗糙但有时很有用.

  • info – 项目提供了一个命令程序手册页的替代物,称为info.

  • whatis – 程序显示匹配特定关键字的手册页的名字和一行命令说明

  • alias – 创建命令别名

  • type 命令是 shell 内部命令,它会显示命令的类别

  • which这个命令只对可执行程序有效,不包括内部命令和命令别名,别名是真正的可执行程序的替代物

  • bash 有一个内建的帮助工具,可供每一个 shell 内部命令使用.输入help,接着是 shell 内部命令名.例如: help cd

  • 许多可执行程序支持一个--help 选项,这个选项是显示命令所支持的语法和选项说明.例如:

  • less 浏览文件内容

  • basename file suffix 用来去掉文件后缀名

  • /bin/kill -L : 查看linux kill 的数字对应的短语

echo输出的时候,可以考虑改变颜色增加辨认度,

  • ldd查看依赖信息

  • sha256sum: 计算并检查 SHA256 message digest (消息摘要)

  • xdg-open: 可以设置别名为open, 使用默认的程序打开文件或者url.


echo  -e "\033[1;47m\033[1;32m Testing output... "


简单命令

  • date 日期

  • cal 日历

  • df 磁盘剩余空间

  • free 空闲内存

  • file 确定文件类型

  • which locate a command

  • type type is a shell builtin

  • cd - 更改工作目录到先前的工作目录

  • cd ~user_name 切换到用户家目录

  • cp -u *.html destination 更新文件到destination

  • ln file link 创建硬链接

  • ln -s item link 创建符号链接, item可以是一个文件或目录,gnome中,按住ctrl+shift拖动会创建链接.

  • df -h,让你以 MBG 为单位查看磁盘的空间.


查看系统版本信息

ubuntu:查看ubuntu系统的版本信息


cat /proc/version

uname -a

sb_release -a


查看主要存储设备的使用情况


df -h | sort -hr --key=2

环境变量

/etc/environment 与 /etc/profile区别

/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。

跟环境变量相关的参数:

/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env

如果你把文本放在双引号中, shell 使用的特殊字符, 除了\(反斜杠),$ ,和 `(倒引号)之外, 则失去它们的特殊含义,被当作普通字符来看待。

这意味着

  • 单词分割, (空格)

  • 路径名展开, (*``?

  • 波浪线展开,(~)

  • 和花括号展开({})

都被禁止,然而

  • 参数展开($USER)

  • 算术展开($(()))

  • 命令替换$()

仍被执行,所以在.zshrc or .bashrc 中设置环境变量的时候, 如果需要用到~,那么就不用加" or ',(不要加任何引号)


export PATH=/usr/local/opt/coreutils/libexec/gnubin:~/bin:$PATH

$HOME:用户目录

shell 模式切换

  1. 查看系统支持的shell模式及位置

echo &SHELL

cat /etc/shells

  1. 切换shell为/bin/sh

# chsh -s /bin/sh

录制屏幕

如果是Gnome3系用户,可以按ctrl + shift + alt + r,屏幕右下角有红点出现,则开始录屏,

要结束的话再按一次ctrl + shift + alt + r,录好的视频在~/video

ls 选项

ls -d */

  • -d= 选项指定只列出目录,glob模式当前目录下*/表示所有的子目录

  • -S 按文件大小排序,大的优先

  • --sort=WORD = 按WORD排序,而不是name: none (-U), size (-S), time (-t), version (-v), extension (-X)

  • --time=WORD= 和 -l一起使用,使用WORD代替默认的修改时间:atime or access or use (-u); ctime or status (-c); also use specified time as sort key if --sort=time (newest first)

  • -X = 按拓展名的字母顺序排列

  • -m用逗号分隔的条目列表填充宽度

  • -x 按行而不是按列输出条目

  • -b, --escape 打印非图形字符的C样式转义符

  • -q, --hide-control-chars 打印?而不是非图形字符

  • --format=WORD 横跨-x,逗号-m,水平-x,长-l,单列-1,verbose-l,垂直-C

别名(alias)

Linux shell 脚本中使用 alias 定义的别名

可以把多个命令放在同一行上,命令之间 用;分开


command1; command2; command3...

我们会用到下面的例子:


[me@linuxbox ~]$ cd /usr; ls; cd -

bin games

kerberos lib64

local

正如我们看到的,我们在一行上联合了三个命令.

首先更改目录到/usr,然后列出目录 内容,最后回到原始目录(用命令cd -),结束在开始的地方.

现在,通过 alia 命令 把这一串命令转变为一个命令.

为了查清此事,可以使用 type 命令:


[me@linuxbox ~]$ type test

test is a shell builtin

哦!test名字已经被使用了.试一下foo:


[me@linuxbox ~]$ type foo

bash: type: foo: not found

创建命令别名:


[me@linuxbox ~]$ alias foo='cd /usr; ls; cd -'

注意命令结构:


alias name='string'

在命令alias之后,输入name,紧接着(没有空格)是一个等号,等号之后是 一串用引号引起的字符串,字符串的内容要赋值给 name.

删除别名,使用 unalias 命令,像这样:


[me@linuxbox ~]$ unalias foo

[me@linuxbox ~]$ type foo

bash: type: foo: not found

如果想要永久保存定义的alias,可以将其写入到 /etc/profile 或者 ~/.bash_rc 中去,

两个的区别是影响的范围不一样而已


zsh 别名

  • grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'

文件管理 cp rm mv

复制移动的时候,可以加上 -i 参数,防止覆盖

cp [OPTION]... SOURCE... DIRECTORY

... 表示可以重复

cp -i ... ...

cp -irf ... ...

短命令可以堆叠, -i -r -f=-irf=--interactive --force --recursive

要删除名称以-开头的文件,例如-foo,请使用以下命令之一:

  • rm -- -foo

  • rm ./-foo

删除本层目录下除了源文件的latex辅助文件


temp_a=$(find . -mindepth 1 -maxdepth 1 -type f   \( -not -name  "*.pdf" \)  \( -not -name  "*.tex" \) \( -not -name  "*.bib" \) -print0); if [[ ${temp_a} != '' ]]; then  echo -n ${temp_a} |  xargs --null rm; fi

可以多用花括号展开,指定多个文件名,例如:


ls ~/draft/draft.2008{03,04,05}.nb

/home/tom/draft/draft.200803.nb  /home/tom/draft/draft.200804.nb  /home/tom/draft/draft.200805.nb

重命名 rename

重命名除了使用mv,也可以使用rename,以下是简单的说明:


rename - renames multiple files

SYNOPSIS


rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr [ files ]

DESCRIPTION

rename根据指定为第一个参数的规则重命名提供的文件名.

perlexpr参数是一个Perl表达式,它修改Perl中的$ _字符串.

如果给定的文件名未被表达式修改,则不会重命名.

如果命令行中未提供文件名,则将通过标准输入读取文件名.

perlepxr三种模式,分别是:

  • 匹配; m

  • 替换; s

  • 转化; tr or y :相当于一个映射表格,进行批量替换

例如,要重命名所有匹配* .bak的文件,以去除扩展名,可以用


rename 's/\w.bak$//' *.bak

要将大写名称转换为小写,可以使用


rename 'y/A-Z/a-z/' *

把文件名中的 中划线 改称 下划线


rename -n 'y/-/_/' */* # 先使用 -n 查看将被改名的文件,但不执行操作

rename -v 'y/-/_/' */* # 去掉 -n 选项,执行操作


后向引用

  • $` : 匹配部分的前一部分字符串

  • $&: 匹配的字符串

  • $': 还没有匹配的剩余字符串

  • $1: 反向引用的第一个字符串


参数

-v, --verbose

Verbose: 打印出重命名成功的文件.

-0, --null

当从STDIN读取时,使用\0作为分隔符。

--path, --fullpath

Rename full path: 重命名任何路径元素, 默认行为

-d, --filename, --nopath, --nofullpath

不重命名文件夹,只重命名文件部分。

-n, --nono

No action: 打印出要重命名的文件,但不执行操作

-e Expression:

作用到文件名上的代码。可以重复使用-e expr1 -e expr2 ...来构建代码,(like perl -e). 如果没有-e,第一个参数被当成code

-E Statement:

类似于-e,但需要;结束

获取绝对路径 realpath

realpath - print the resolved path(打印已解析的路径)

SYNOPSIS

realpath [OPTION]... FILE...

DESCRIPTION

打印解析的绝对文件名;除最后一个组件外的所有组件都必须存在

-e, --canonicalize-existing: 路径的所有组成部分必须存在

-m,--canonicalize-missing:路径组件不需要存在,也不必是目录

-L, --logical:解析符号链接前的..组件

-P, --physical:解析遇到的符号链接(默认)

-q, --quiet:禁止显示大多数错误消息

--relative-to=DIR:打印相对于DIR的解析路径

--relative-base=DIR:只打印DIR后面的绝对路径路径

-s, --strip, --no-symlinks:不扩展符号链接

-z,--zero:用NUL而不是换行符结束每个输出行

canonical order: 在排序中,指一种标准的顺序,比如字母顺序.

tar and 7z 压缩


创建压缩文件

  • tar -cvf a.tar /etc

  • gzip foo.txt

  • gzip -fvr foo.txt: force,verbose,recursive

  • zip -r foo.zip a b c ...

同时用gunzip压缩

  • tar -czvf a.tar.gz /etc

解压缩xxx.tar.gz

  • tar -xzvf xxx.tar.gz

  • gzip foo.txt

  • gzip -tv foo.txt.gz : test,检验压缩文件完整性

  • unzip file[.zip] [file(s) ...] [-x xfile(s) ...] [-d exdir] 文件名中可以使用通配符,但要quote起来

查看压缩文件内容,以下命令都可以

  • tar -tf xxx.tar.gz

  • tar -tzf xxx.tar.gz

  • gunzip -c foo.txt | less

  • zcat foo.txt.gz | less

  • unzip -l file[.zip] [file(s) ...]

支持的解压过滤器如下

  • -a, --auto-compress 使用存档后缀来确定压缩程序。

  • -I, --use-compress-program=COMMAND: 通过COMMAND过滤数据。它必须接受-d选项以进行解压缩。该参数可以包含命令行选项。

  • -j, --bzip2: 通过bzip2(1)过滤存档。

  • -J, --xz: 通过xz(1)过滤存档。

  • --lzip :通过lzip(1)过滤存档。

  • --lzma :通过lzma(1)过滤存档。

  • --lzop:通过lzop(1)过滤存档。

  • --no-auto-compress: 不要使用存档后缀来确定压缩程序。

  • -z, --gzip, --gunzip, --ungzip: 通过gzip(1)过滤存档。

  • -Z, --compress, --uncompress通过compress(1)过滤存档。

  • --zstd: 通过zstd(1)过滤存档。


7z解压缩

支持的格式

LZMA2, XZ, ZIP, Zip64, CAB, RAR (如果安装了 non-free p7zip-rar包),

ARJ, GZIP, BZIP2, TAR, CPIO, RPM, ISO

用法: 7z <command> [<switches>...] <archive_name> [<file_names>...] [<@listfiles...>]

解压缩,输入密码,并保持目录结构:

7z x -p1234 filename

压缩单个文件

7z a -t7z archive_name filename

压缩txt中的文件

7z a -t7z configrc.win.7z @tom.rc_list.win

7z a -t7z configrc.linux.7z @tom.rc_list.linux

<Commands>

  • a : 添加文件到归档中

  • b : Benchmark

  • d : 从归档中删除

  • e : 从归档中提取(不使用目录名)

  • h : 计算文件的 hash 值

  • i : 展示支持的格式

  • l : 列出归档的内容

  • rn : 重命名归档中的文件

  • t : 检查归档的完整性

  • u : 把文件更新到归档

  • x : 提取文件,使用全路径(也就是保持文件结构)

<Switches>

  • -- : Stop switches parsing

  • -o{Directory} : 设置输出目录

  • -p{Password} : 设置密码

  • -r[-|0] : 递归子目录

  • -y : 所有 queries 回答 yes

  • -t{Type}设置归档的 type

查看和安装字体

fc-list: list available fonts


fc-list [ -vVh ]  [ pattern  [ element... ]   ]


fc-list :lang=zh

:lang=zh 代表匹配模式


安装字体

Ubuntu系统字体命令和字体的安装

字体有.ttf格式(truetype font)和.otf格式(opentype font)字体

如果系统中没有中文字体,需要先行安装中文字体,在UbuntuCent OS中的安装步骤如下:

  • 从网络上下载字体或者直接从其他计算机(windows)上拷贝

  • 建立/usr/share/fonts/myfonts 目录

  • cd /usr/share/fonts/

/etc/fonts/conf.d目录下,有字体配置文件的符号链接

如果fonts/目录不存在,则创建


mkdir fonts

mkdir myfonts

把下载好的字体拷贝到/usr/share/fonts/myfonts目录下:


sudo cp ~/myfonts/* /usr/share/fonts/myfonts/

# ~/myfonts/ 是保存字体的目录

  • 修改字体文件的权限,使root用户以外的用户也可以使用

cd /usr/share/fonts/

sudo chmod -R  755 myfonts/

(5) 建立字体缓存


sudo mkfontscale && mkfontdir && fc-cache -fv


sudo mkfontscale

# 如果提示 mkfontscale: command not found

# 在Ubuntu下运行如下命令

# sudo apt-get install ttf-mscorefonts-installer

# 在cent os下运行如下命令

# yum install mkfontscale

sudo mkfontdir

sudo fc-cache -fv

# fc-cache - build font information cache files

# 如果提示 fc-cache: command not found

# 在Ubuntu下运行如下命令

# sudo apt-get install fontconfig

# 在cent os下运行如下命令

# yum install fontconfig

至此字体就安装成功了,如果需要安装其他字体,只需将字体拷贝到字体目录下,重新运行以上的命令即可.

apt 与 apt-get

Linux中apt与apt-get命令的区别与解释

如果你已阅读过我们的 apt-get 命令指南,可能已经遇到过许多类似的命令,如apt-cache,apt-config 等.如你所见,这些命令都比较低级又包含众多功能,普通的 Linux 用户也许永远都不会使用到.换种说法来说,就是最常用的 Linux 包管理命令都被分散在了 apt-get,apt-cacheapt-config 这三条命令当中.

apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cacheapt-config 命令中很少用到的功能.

在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cacheapt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项.

简单来说就是:apt = apt-get,apt-cacheapt-config 中最常用命令选项的集合.


apt

install, remove, purge (apt-get(8))

apt list(半成品)

apt list类似于dpkg-query --list,它可以显示满足某些条件的软件包列表。

它支持用glob(7)匹配软件包名称,以及列出已安装(--installed),可升级(--upgradeable)或所有可用(--all-versions)版本的选项。

另外也可以用whereis

whereis - 找到命令的二进制文件,源文件和 man 文件


apt-get --install-suggests

将建议的软件包视为安装的依赖项. 配置项:APT::Install-Suggests.


apt-get -f install pkg

dpkg 应用管理

  • ldd /bin/ls : ldd查看依赖信息

  • dpkg -i pkg: 安装pkg.deb

  • dpkg -r pkg: 删除已安装的程序包

  • dpkg -P pkg: 彻底清除已安装的程序包

  • dpkg -l, --list package-name-pattern...: 列出与给定模式匹配的软件包。

  • dpkg -s, --status package-name...: 报告指定软件包的状态。

  • dpkg -L, --listfiles package-name...: 从软件包名称列出安装到系统的文件。

  • dpkg -S, --search filename-search-pattern... 从已安装的软件包中搜索文件名。

  • dpkg -p, --print-avail package-name... 显示有关软件包名称的详细信息,存放在/var/lib/dpkg/available,基于APT的前端的用户使用apt-cache

grep 过滤输出

  • -n 行号

  • -v,--invert-match 匹配不符合

  • --color 染色

  • -P perl 拓展

  • -B before 前输出

  • -A after 后输出

  • -o only 仅输出匹配字符

  • -i --ignore-case 忽略大小写

  • -m NUM, --max-count=NUM 输出的最大行

Stop reading a file after NUM matching lines.

If the input is standard input from a regular file, and NUM matching lines are output,

grep ensures that the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing(后面的) context lines.

This enables a calling process to resume a search. When grep stops after NUM matching lines, it outputs any trailing context lines.

When the -c or --count option is also used, grep does not output a count greater than NUM.

When the -v or --invert-match option is also used, grep stops after outputting NUM non-matching lines.

example:


grep -n --color -P -B 1 -A 6 "(?:tex:\d+:|warning:)" ./temp $tex_file".log"

-e PATTERNS, --regexp=PATTERNS: 使用PATTERNS作为模式.

此选项可以多次使用或与-f(--file)选项结合使用,搜索给定的所有模式. 此选项可用于保护以-开头的模式.

f FILE, --file=FILE:从FILE中获取模式,每行一个.

如果此选项多次使用或与-e(--regexp)选项结合使用,则搜索给定的所有模式. 空文件包含零个模式,因此不匹配.

图片格式转换

pkg: pdftoppm

pdftoppm -png -rx 300 -ry 300 input.pdf outputname

pdftoppm input.pdf outputname -png -f {page} -singlefile

This will output each page in the PDF using the format outputname-01.png, with 01 being the index of the page.

Converting a single page of the PDF

Change {page} to the page number. It's indexed at 1, so -f 1 would be the first page.

查看图片用 eye of gnome eog

ubuntu 自带截图

ubuntu自带截图程序叫做gnome-serceenshot

Ubuntu设置截图到剪贴板,像QQ一样截图

定义一个快捷键,保存到桌面文件


gnome-screenshot -a --file=(~"/Desktop/$(date +%s).png")

date +%s给出 UTC 时间

在 Ubuntu(18.04,16.04)或 Debian(Jessie 和更新版本)中安装 GPaste

对于 Debian,GPaste 可用于 Jessie 和更新版本,而对于 Ubuntu,GPaste 在 16.04 及更新版本的仓库中(因此可在 Ubuntu 18.04 Bionic Beaver 中使用).

你可以使用以下命令在 Debian 或 Ubuntu 中安装 GPaste(守护程序和 Gnome Shell 扩展):


sudo apt install gnome-shell-extensions-gpaste gpaste

安装完成后,按下 Alt + F2 并输入 r 重新启动 Gnome Shell,然后按回车键.

现在应该启用了 GPaste Gnome Shell 扩展,其图标应显示在顶部 Gnome Shell 面板上.

如果没有,请使用 Gnome Tweaks(Gnome Tweak Tool)启用扩展.

Debian 和 Ubuntu 的 GPaste 3.28.0 中有一个错误,如果启用了图像支持选项会导致它崩溃,所以现在不要启用此功能.

这在 GPaste 3.28.2 中被标记为已修复,但 Debian 和 Ubuntu 仓库中尚未提供此包.

文档格式转换

pandoc

pandoc [options] [input-file]...

-f --from -t --to

--latex-engine=pdflatex|lualatex|xelatex

把markdown转换成pdf


pandoc -f markdown --latex-engine=xelatex -o output.pdf input.md

ubunut 安装 typora

typora for linux


# or run:

# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE

wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add -

# add Typora's repository

sudo add-apt-repository 'deb https://typora.io/linux ./'

sudo apt-get update

# install typora

sudo apt-get install typora

挂载命令 mount

linux挂载命令mount及U盘,移动硬盘的挂载

gpt格式的移动硬盘在Linux系统下挂载方法

  • mount -l -t type : -l 选项可以显示label

  • findmnt [options] device|mountpoint: 可以更清晰的显示文件系统

  • umount [-dflnrv] {directory|device} : 卸载文件系统,应该通过给出文件目录来使用,-l, --lazyLazy unmount


fdisk 查看磁盘列表


sudo fdisk -l

显示某个特定设备


sudo fdisk -l /dev/sdb

首先查看所有已经 mount 的设备:


mount [-l] [-t type]

显示如下信息


root@kali:~# fdisk -l

...

Device     Boot     Start       End   Sectors   Size Id Type

/dev/sda1  *  2048 209719295 209717248   100G  7 HPFS/NTFS/exFAT

/dev/sda2       209719296 976773119 767053824 365.8G  f W95 Ext'd (LBA)

/dev/sda5       209721344 465575935 255854592   122G  7 HPFS/NTFS/exFAT

/dev/sda6       465577984 721432575 255854592   122G  7 HPFS/NTFS/exFAT

/dev/sda7       721434624 976773119 255338496 121.8G  7 HPFS/NTFS/exFAT

...

parted /dev/sdb print 显示 sdb 的分区表

可以知道sdb2(135M to 6001G)为基本数据分区,格式为NTFS

mount 命令的标准格式:


mount -t type device dir

告诉 kernel attach the filesystem found on device (which is of type type) at the directory dir. The option -t type is optional.

挂载到指定目录即可:


sudo mount -t ntfs /dev/sda1 /home/6T

The option -l adds labels to this listing.


弹出设备


umount /dev/sda5

通过df可以查看设备挂载点

U盘格式化

将 USB 盘格式化为 exFAT

Linux kernel 5.4开始,Linux 内核本身中启用了 exFAT 文件系统支持。检查正在运行的 Linux 内核版本。uname -r

如果是内核 5.4 或更高版本,那么应该没问题。

不然,你必须启用exFAT支持。在基于 Ubuntu 的发行版中,你可以安装以下软件包:


sudo apt install exfat-fuse exfat-utils


方法 1:使用 GNOME 磁盘工具将磁盘格式化为 exFAT

使用GNOME 磁盘 格式化驱动器是一项简单的工作。它预装在许多 Linux 发行版中。

插入外部 USB 盘。在菜单中查找 Disk,然后打开GNOME 磁盘 应用。第一步,选择要格式化的驱动器,要使用 exFAT,请选择 其它,然后单击下一步


方法 2:在 Linux 命令行中将磁盘格式化为 exFAT.

插入外部硬盘,然后在终端中输入以下命令sudo fdisk -l.通过列出的磁盘大小信息找出USB的标记,假设为/dev/sdc1.

如果磁盘有多个分区,想要管理,可以使用sudo fdisk /dev/sdc进行分区的管理工作。这里要输入/dev/sdc而不是/dev/sdc1.

进入交互式分区工具:

m提示可用的命令列表.

o:创建新的dos分区表

t:更改分区类型, dos 类型的分区表,如果要和windows格式化一致,为HPFS/NTFS/exFAT,就输入7.

w:保存更改,q退出不保存更改.

在这里更改分区表保存后,磁盘已经可用了.如果保存原来的分区直接格式,可以使用mkfs.exfat:

  • mkfs.exfat:格式化成exfat.

  • mkfs.fat:格式化成fat32.

man mkfs.exfat会发现,mkfs.exfat的同义词mkexfatfs.如果分区表是MBR类型的,需要将文件系统类型设置为0X07(NTFS/exFAT),否则其他操作系统可能会拒绝挂载。

仍然假设U盘分区为/dev/sdc1,使用以下命令将它格式化为 exfat


sudo mkfs.exfat -i 0x07 -n udisk /dev/sdc1

/dev/sdc1 替换为你的磁盘 IDudisk 是你要为磁盘命名的名称。可选地,运行 fsck 检查sudo fsck.exfat /dev/sdc1,以确保格式化正确, 享受 exFAT 盘吧。

查看文档首行末行

文档尾巴, tail -n, --lines=[+]NUM, 从第num行开始.

文档开头, head -n, --lines=[-]NUM, 减去最后num行.

查看使用的桌面环境

如何找出你所使用的桌面环境


检查你使用的是哪个桌面环境

你可以在 Linux 中使用 echo 命令在终端中显示 XDG_CURRENT_DESKTOP 变量的值.


echo $XDG_CURRENT_DESKTOP

echo $XDG_SESSION_TYPE


如何获取桌面环境版本

与获取桌面环境的名称不同.获取其版本号的方法并不直接,因为它没有标准的命令或环境变量可以提供此信息.

在 Linux 中获取桌面环境信息的一种方法是使用 Screenfetch 之类的工具.

此命令行工具以 ascii 格式显示 Linux 发行版的 logo 以及一些基本的系统信息.桌面环境版本就是其中之一.

安装:sudo apt install screenfetch.

对于其他 Linux 发行版,请使用系统的软件包管理器来安装此程序.

安装后,只需在终端中输入 screenfetch 即可,它应该显示桌面环境版本以及其他系统信息.

查看linux 系统信息

ref: 3 Ways to Check Linux Kernel Version in Command Line


uname

inxi -S: 命令行 系统信息脚本 for console and IRC

uname -打印系统信息

uname -r命令的输出为:5.4.0-48-generic

这意味着您正在运行Linux内核5.4.0-48,或更笼统地说,您正在运行Linux内核版本5.4.

但是其他数字在这里意味着什么?

  • 5 – 内核版本

  • 4 – 重大修订

  • 0 – 次要修订

  • 48– Bug fix

  • generic–特定于发行版的字符串.对于Ubuntu,这表示我使用的是desktop版本.

对于Ubuntu服务器版本,它将是server

使用-a选项可以输出更多信息

uname -a

命令的输出应如下所示:

Linux OP7050 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

让我解释一下输出及其含义:

  • Linux –内核名称. 如果在BSD或macOS上运行相同的命令,结果将有所不同.

  • OP7050 –主机名.

  • 5.4.0-48-generic –内核版本(如我们在上面看到的).

  • 52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 –这意味着Ubuntu已编译5.4.0-48-generic 52次. 最后一次编译的时间戳也在那里.

  • x86_64 –机器架构.

  • x86_64 –处理器架构.

  • x86_64 –操作系统体系结构(您可以在64位处理器上运行32位OS).

  • GNU / Linux –操作系统(它不会显示发行版名称).

让我们看看其他一些命令来查找您的Linux内核版本.


使用 /proc/version file

在Linux中,您还可以在文件/proc/version中找到内核信息. 只需查看此文件的内容即可:

cat /proc/version

在命令行中检查Linux内核版本, 您会看到类似于uname的输出.

Linux version 5.4.0-48-generic (buildd@lcy01-amd64-010) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020

您可以在此处看到内核版本5.4.0-48-generic.


使用dmesg

Linux dmesg命令

dmesg是用于编写内核消息的强大命令.这对于获取系统信息也非常有用.dmesg命令用于显示开机信息.

kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息亦保存在/var/log目录中,名称为dmesg的文件里.

由于dmesg提供了很多信息,使用grep挑选.


dmesg | grep Linux

输出将包含几行,但是您应该能够在其中轻松识别Linux内核版本.


[    0.000000] Linux version 5.4.0-48-generic (buildd@lcy01-amd64-010) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 (Ubuntu 5.4.0-48.52-generic 5.4.60)

...

[   12.936690] Intel(R) Wireless WiFi driver for Linux

curl wget

curl -fsSL https://www.preining.info/rsa.asc | tlmgr key add -

-f, --fail

(HTTP)服务器错误时静默失败(没有输出)。这样做主要是为了更好地使脚本等更好地处理失败的尝试。

在正常情况下,当HTTP服务器无法交付文档时,它将返回HTML文档,说明(通常还会描述原因及更多)。该flag将阻止curl输出该错误并返回error 22

此方法不是fail-safe的,并且有时会漏入不成功的响应代码,尤其是在涉及验证时(response codes 401 and 407)。

-s, --silent

静音或安静模式。不显示进度表或错误消息。使Curl静音。仍会输出您要求的数据,甚至到终端/标准输出,除非您将其重定向。

除此选项外,还可以使用-S--show-error禁用进度表,但仍显示错误消息。

另请参见-v, --verbose and --stderr.

-S, --show-error

-s, --silent一起使用时,如果curl失败,它将使curl显示一条错误消息。

-L, --location

(HTTP)如果服务器报告请求的页面已移动到其他位置(由Location: header and a 3XX响应代码),此选项将使curl在新位置上重做请求。

如果与-i--include-l,--head一起使用,将显示所有请求页面的headers。使用身份验证时,curl仅将其凭据发送到初始主机.

如果重定向将curl转移到其他主机,它无法截获user+password

另请参阅--location-trusted查看如何修改这项设置。

您可以使用--max-redirs选项来限制要遵循的重定向数量。

当curl跟随重定向并且请求不是简单的GET(例如POSTPUT)时,it will do the following request with a GET:

如果HTTP响应是301302303。如果响应代码是任何其他3xx代码,curl will resend the following request using the same unmodified method.

您可以通过使用专用的选项--post301, --post302 and --post303, 来告诉curl 对于30xresponse, 不要将 non-GET request method 更改为GET.

查看ip地址

使用ip命令


ip addr show

ip link show #查看 MAC 地址

安装额外解码器

如果你刚刚安装了 Ubuntu 或其他 Ubuntu 特色版本 如 Kubuntu,Lubuntu 等,你会注意到系统无法播放某些音频或视频文件.

对于视频文件,你可以在 Ubuntu 上安装 VLC.VLC 是 Linux 上的最佳视频播放器之一,它几乎可以播放任何视频文件格式.但你仍然会遇到无法播放音频和 flash 的麻烦.

好消息是 Ubuntu 提供了一个软件包来安装所有基本的媒体编解码器:ubuntu-restricted-extras.

ubuntu-restricted-extras 是一个包含各种基本软件,如 Flash 插件,unrar ,gstreamer,mp4,Ubuntu 中的 Chromium 浏览器的编解码器等的软件包.

由于这些软件不是开源软件,并且其中一些涉及软件专利,因此 Ubuntu 默认情况下不会安装它们.你必须使用 multiverse 仓库,它是 Ubuntu 专门为用户提供非开源软件而创建的仓库.

由于 ubuntu-restrcited-extras 软件包在 multiverse 仓库中,因此你应验证系统上已启用 multiverse 仓库:


sudo add-apt-repository multiverse

然后你可以使用以下命令安装:


sudo apt install ubuntu-restricted-extras

What are Ubuntu Repositories

一条命令在 Ubuntu 中安装所有基本的媒体编解码器

source

Ubuntu如何使用source命令执行文件

Ubuntu source 命令的作用就是将设置在文件中的配置信息马上生效,而不需要经过重启.

Ubuntu如何使用source命令执行文件

source命令用法:

source filename. filename

在对编译系统核心时常常需要输入一长串的命令,如:


make mrproper

make menuconfig

make dep

make clean

make bzImage

......

如果把这些命令做成一个文件,让它自动顺序执行,对于需要多次反复编译系统核心的用户来说会很方便,

而用source命令就可以做到这一点,

它的作用就是把一个文件的内容当成shell来执行,先在linux的源代码目录下(如/usr/src/linux-2.4.20)建立一个文件,如make_command,在其中输入一下内容:


make mrproper &&

make menuconfig &&

make dep &&

make clean &&

...

文件建立好之后,每次编译核心的时候,只需要在/usr/src/linux-2.4.20下输入:source make_command即可

顺便补充一点,&&命令表示顺序执行由它连接的命令,但是只有它之前的命令成功执行完成了之后才可以继续执行它后面的命令.

另外执行source命令时如果提示command not found,是因为环境变量没配置好的原因,在终端运行如下命令即可修复:

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

查看磁盘空间

df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式:

df - report file system disk space usage


SYNOPSIS

df [OPTION]... [FILE]...

  • -a, --all include pseudo, duplicate, inaccessible file systems

  • -l, --local limit listing to local file systems

  • -h, --human-readable print sizes in powers of 1024 (e.g., 1023M)

  • -T, --print-type print file system type

find

删除日志文件


sudo /dev/null > /var/log/**.log

下面这个推荐使用,删除30天之前的旧文件


sudo find /var/log/ -type f -mtime +30 -exec rm -f {} \;


find - search for files in a directory hierarchy

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]


expression

starting points列表之后的部分是表达式。这是一种查询规范,描述了我们如何匹配文件以及如何处理匹配的文件。

表达式由一系列事物组成:Test, Actions,...


-exec command ;

执行命令;如果返回0状态,则为true。之后传递给find的参数都将作为命令的参数,直到遇到;为止。

字符{}被替换为当前文件名命令参数中出现的任何地方的当前文件名,而不仅仅是在单独存在的参数中。

这两种构造都可能需要转义(以\表示)或加引号以保护它们,避免 shell 展开。

有关使用-exec选项的示例,请参见示例部分。对每个匹配的文件运行一次指定的命令。

该命令在起始目录中执行。与-exec有关的操作具有不可避免的安全问题;你应该使用-execdir选项代替。


-exec command {} +

在选定的文件上运行指定的命令, -exec action的变体. 但是通过在命令结尾附加上每个选中的文件名;

该命令的调用总数将远远少于匹配文件的数目。命令行的构建方式与xargs几乎相同.

命令中仅允许使用一个{}实例,并且当从shell调用find时,应该用引号保护起来, 例如'{}',以防止其被shell解释。

该命令在起始目录中执行。如果有任何调用返回一个非零值作为退出状态,则find返回一个非零退出状态。

如果find遇到错误,有时可能会导致立即退出,因此一些待处理的命令可能根本不会运行。This variant of -exec always returns true.


-mtime n

文件数据的最后修改时间为 n*24 小时。请参阅-atime的注释,以了解舍入如何影响文件修改时间的解释

-type c

File is of type c:

  • b block (buffered) special

  • c character (unbuffered) special

  • d directory

  • p named pipe (FIFO)

  • f regular file

查看文件大小

Ubuntu下查看文件、文件夹和磁盘空间的大小

在实际使用ubuntu时候,经常要碰到需要查看文件以及文件夹大小的情况.

有时候,自己创建压缩文件,可以使用 ls -hl查看文件大小.参数-h 表示Human-Readable,使用GB,MB等易读的格式方式显示.对于文件夹的大小,ll -h 显示只有4k.


那么如何来查看文件夹的大小呢?

使用du命令查看文件或文件夹的磁盘使用空间,–max-depth 用于指定深入目录的层数.

如要查看当前目录已经使用总大小及当前目录下一级文件或文件夹各自使用的总空间大小,

输入du -h --max-depth=1即可.

如要查看当前目录已使用总大小可输入:du -h --max-depth=0



du [OPTION]... [FILE]...

du [OPTION]... --files0-from=F

  • -s, --summarize: 对每个参数仅显示总计

  • -h, --human-readable: 以人类可读的格式显示大小(例如1K 234M 2G

  • -d, --max-depth=N: 指定目录递归的层数;--max-depth = 0--summaryize相同

  • --si like -h, 但是使用1000的幂而不是1024的幂

  • -a, --all :给出所有文件的统计,而不仅仅是目录

创建链接

ln — 创建链接

ln 命令即可创建硬链接,也可以创建符号链接.

可以用其中一种方法来使用它:

  • ln file link 创建硬链接

  • ln -s item link 创建符号链接,item 可以是一个文件或是一个目录.

硬链接

硬链接和符号链接比起来,硬链接是最初 Unix 创建链接的方式,而符号链接更加现代. 在默认情况下,每个文

件有一个硬链接,这个硬链接给文件起名字.

当我们创建一个 硬链接以后,就为文件创建了一个额外的目录条目.硬链接有两个重要局限性:

  1. 一个硬链接不能关联它所在文件系统之外的文件.这是说一个链接不能关联 与链接本身不在同一个磁盘分区

上的文件.

  1. 一个硬链接不能关联一个目录.

一个硬链接和文件本身没有什么区别.不像符号链接,当你列出一个包含硬链接的目录 内容时,你会看到没有特

殊的链接指示说明.当一个硬链接被删除时,这个链接 被删除,但是文件本身的内容仍然存在(这是说,它所占

的磁盘空间不会被重新分配), 直到所有关联这个文件的链接都删除掉.知道硬链接很重要,因为你可能有时

会遇到它们,但现在实际中更喜欢使用符号链接,下一步我们会讨论符号链接.

符号链接

创建符号链接是为了克服硬链接的局限性.

符号链接生效,是通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的文本指针.

在这一方面, 它们和 Windows 的快捷方式差不多,当然,符号链接早于Windows 的快捷方式 很多年;-)

一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别.

例如,如果你往一个符号链接里面写入东西,那么相关联的文件也被写入.

然而, 当你删除一个符号链接时,只有这个链接被删除,而不是文件自身.

如果先于符号链接删除文件,这个链接仍然存在,但是不指向任何东西.

在这种情况下,这个链接被称为坏链接.

在许多实现中,ls 命令会以不同的颜色展示坏链接,比如说红色,来显示它们的存在.


创建硬链接

现在,我们试着创建链接.首先是硬链接.我们创建一些关联我们 数据文件的链接:


[me@linuxbox playground]$ ln fun fun-hard

[me@linuxbox playground]$ ln fun dir1/fun-hard

[me@linuxbox playground]$ ln fun dir2/fun-hard

ls 命令有一种方法,来展示(文件索引节点)的信息.在命令中加上-i选项:


创建符号链接

建立符号链接的目的是为了克服硬链接的两个缺点:硬链接不能跨越物理设备, 硬链接不能关联目录,只能是文

件.符号链接是文件的特殊类型,它包含一个指向 目标文件或目录的文本指针.

符号链接的建立过程相似于创建硬链接:


[me@linuxbox playground]$ ln -s fun fun-sym

[me@linuxbox playground]$ ln -s ../fun dir1/fun-sym

[me@linuxbox playground]$ ln -s ../fun dir2/fun-sym

第一个实例相当直接,在 ln 命令中,简单地加上-s选项就可以创建一个符号链接, 而不是一个硬链接.

fun-sym 的列表说明了它是一个符号链接,通过在第一字段中的首字符l 可知,并且它还指向../fun,也是正确的.

当建立符号链接时,你即可以使用绝对路径名:


ln -s /home/me/playground/fun dir1/fun-sym

也可用相对路径名,正如前面例题所展示的.使用相对路径名更令人满意, 因为它允许一个包含符号链接的目录重命名或移动,而不会破坏链接.

basename


截取文件名和后缀

编写Shell脚本的过程中,经常会和文件名和文件路径打交道.

如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢.

Shell脚本拥有强大的字符串处理能力,如果把文件名当做字符串,我们不难使用cutsed这样的工具得到我们想要的结果.


$fullfile=/the/path/foo.txt

$fullname=$(basename $fullfile)

$dir=$(dirname $fullfile)

$filename=$(echo $fullname | cut -d . -f1)

$extension=$(echo $fullname | cut -d . -f2)

echo $dir , $fullname , $filename , $extension

/the/path , foo.txt , foo , txt

这里使用basename命令可以直接得到包含后缀的文件名,而dirname命令可以得到路径名,

然后就能简单的用cut截取文件名和后缀名.


更复杂的情况

如果对付简单应用场景,到这里已经可以打完收工了,但是有时候文件可能不止有一个后缀,比如*.tar.gz,怎样得到最后一个后缀呢?

cut一回?当然可以,但是如果文件名是mylib.1.0.1a.zip这样的呢?呃......正则表达式肯定可以.


$ fullname=mylib.1.0.1a.zip

$ filename=$(echo $fullname | sed 's/\.[^.]*$//')

$ extension=$(echo $fullname | sed 's/^.*\.//')

echo $filename$extension

mylib.1.0.1a, zip

这里面的逻辑是这样的:

文件名:把以.字符开头以后一直到行尾都是非.字符的子串替换为空.

后缀名:把从行首开始以.字符结尾的子串替换为空.

光用语言把这两个正则表达式描述出来脑细胞也要死不少.有没有像上面cut版本一样简单容易理解的方法呢?

由于.分隔符的个数不确定,正常使用cut来分割最后一个.字符是不太可能的.

但是我们可使用rev命令将字符串反转一下,区分后缀和文件名的.字符位置就确定了.

截取了想要的部分之后,再次反转就得到了我们想要的内容.


$ fullname=mylib.1.0.1a.zip

$ filename=$(rev <<< $fullname | cut -d . -f2- | rev)

$ extension=$(rev <<< $fullname | cut -d . -f1 | rev)

echo $filename$extension

mylib.1.0.1a, zip


使用参数扩展

其实不借助复杂的正则表达式,甚至不调用basename, dirname, cut, sed命令,shell脚本一样可以做到所有的操作.

看下面的实现:


$ fullfile=/the/path/mylib.1.0.1a.zip

$ fullname="${fullfile##*/}"

$ dir="${fullfile%/*}"

$ extension="${fullname##*.}"

$ filename="${fullname%.*}"

echo $dir , $fullname , $filename , $extension

/the/path , mylib.1.0.1a.zip , mylib.1.0.1a , zip

真是不能再简洁了,大括号之内变量名配合几个神奇的字符,就是Shell的参数扩展(Parameter Extension)功能.

  • ${fullfile##*/}:从前面开始删除fullfile中最大匹配(longest matching pattern) */ 的字符串

  • ${fullfile%/*}:从后面开始删除fullfile中最小匹配(shortest matching pattern) /* 的字符串

  • ${fullname##*.}:从前面开始删除fullname中最大匹配(longest matching pattern) *. 的字符串

  • ${fullname%.*}:从后面开始删除fullname中最小匹配(shortest matching pattern) .* 的字符串

参数扩展有多种形式,在shell编程中可以用作参数的拼接,字符串的替换,参数列表截取,变量初值等操作,

这里不再详述,请参考后面的功能列表和官方文档


使用basename命令输出所有*.tex的名字


basename -s '.tex' $(ls *.tex) | xargs echo

inode

Linux的inode的理解


inode是什么

理解inode,要从文件储存说起.

文件储存在硬盘上,硬盘的最小存储单位叫做扇区(Sector).每个扇区储存512Byte(相当于0.5KB).

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).

这种由多个扇区组成的,是文件存取的最小单位.的大小,最常见的是4KB,即连续八个 sector组成一个 block.

文件数据都储存在中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等.

这种储存文件元信息的区域就叫做inode,中文译名为索引节点, index node.


inode的内容

inode包含文件的元信息,具体来说有以下内容:

  • 文件的字节数

  • 文件拥有者的User ID

  • 文件的Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳,共有三个:ctimeinode 上一次变动的时间, mtime 指文件内容上一次变动的时间, atime 指文件上一次打开的时间.

  • 链接数,即有多少文件名指向这个 inode

  • 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:


stat example.txt

总之,除了文件名以外的所有文件信息,都存在inode之中.至于为什么没有文件名,下文会有详细解释.


inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域.一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息.

每个inode节点的大小,一般是128字节或256字节.

inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode.

假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%.

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令.


df -i

查看每个inode节点的大小,可以用如下命令:


sudo dumpe2fs -h /dev/hda | grep "Inode size"

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况.这时,就无法在硬盘上创建新文件.


inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件.

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件.对于系统来说,文件名只是inode号码便于识别的别称或者绰号.

表面上,用户通过文件名,打开文件.实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;

最后,根据inode信息,找到文件数据所在的block,读出数据.

使用ls -i命令,可以看到文件名对应的inode号码:


ls -i example.txt


目录文件

Unix/Linux系统中,目录(directory)也是一种文件.打开目录,实际上就是打开目录文件.

目录文件的结构非常简单,就是一系列目录项(dirent)的列表.每个目录项,由两部分组成: 所包含文件的文件名,以及该文件名对应的 inode 号码.

ls命令只列出目录文件中的所有文件名:


ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:


ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息.ls -l命令列出文件的详细信息.


ls -l /etc


硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名.但是,Unix/Linux系统允许,多个文件名指向同一个inode号码.

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问.这种情况就被称为"硬链接"(hard link).

ln命令可以创建硬链接:


ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode.inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1.反过来,删除一个文件名,就会使得inode节点中的"链接数"减1.当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域.

这里顺便说一下目录文件的"链接数".创建目录时,默认会生成两个目录项:"."和"..".前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接".所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的"硬链接"和当前目录下的".硬链接".


软链接

除了硬链接以外,还有一种特殊情况.文件A和文件Binode号码虽然不一样,但是文件A的内容是文件B的路径.

读取文件A时,系统会自动将访问者导向文件B.因此,无论打开哪一个文件,最终读取的都是文件B.这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link).

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory".

这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件Binode号码,文件Binode"链接数"不会因此发生变化.

ln -s命令可以创建软链接.


ln -s 源文文件或目录 目标文件或目录


inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象.

  • 有时,文件名包含特殊字符,无法正常删除.这时,直接删除inode节点,就能起到删除文件的作用.

  • 移动文件或重命名文件,只是改变文件名,不影响inode号码.

  • 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名.因此,通常来说,系统无法从inode号码得知文件名.

3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启.

因为系统通过inode号码,识别运行中的文件,不通过文件名.更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件.

等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收.

shebang 脚本开头

Shebang

大多数Linux shellperl/python脚本以以下行开头:


#!/bin/bash

#!/usr/bin/perl

#!/usr/bin/python

#!/usr/bin/python3

#!/usr/bin/env bash

这称为shebangbang行。

shebang(意思为这一切)其实就是Bash解释器的绝对路径。几乎所有的bash脚本通常都以#!/bin/bash开头(假设Bash已安装在/bin中).

这样可以确保即使在另一个shell下执行脚本,也可以使用Bash来解释该脚本。

Shebang是由Dennis Ritchie在第7版和8版Unix之间在Bell实验室推出的。然后,它也被添加到Berkeley的BSD中。

/usr/bin/env在修改后的环境中运行bash之类的程序。它使您的bash脚本具有可移植性。

#!/usr/bin/env bash的优点是,它将使用运行用户的$PATH变量中最先出现的bash可执行文件。

查看日志

linux系统日志在哪?

linux日志介绍


sudo tail -f /var/log/messages

# or in ubuantu

sudo tail -f /var/log/kern.log

linux日志大多是以明文存储,一般存储在/var/log目录中,linux系统中主要有三个日志子系统:连接时间日志,进程统计日志,错误日志。

  • assess-log 记录和HTTP/web的传输

  • secure 记录登录系统存取资料的消息

  • btmp 记录失败的消息

  • lastlog 记录最近几次成功登录的事件和最后一次不成功的登录

  • messages:包括整体系统信息,其中也包含系统启动期间的日志。此外,还包括mailcrondaemonkernauth等内容

  • sudolog 记录sudo发出的命令

  • sulog 记录使用su命令的使用

  • utmp 记录当前登录的每个用户

  • wtmp 一个用户每次登录进入和退出的的永久记录

  • syslog:它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息。

  • xferlog 记录了FTP会话

  • user.log:记录所有等级用户信息的日志。

  • auth.log:包含系统授权信息,包括用户登录和使用的权限机制等。

  • daemon.log:包含各种系统后台守护进程日志信息。

  • kern.log:包含内核产生的日志,有助于在定制内核时解决问题。

连接时间日志是有多个程序执行的,把日志记录到/var/log/wtmp, /var/run/utmp,/var/log/lastlog 三个文件中,这三个文件记录了用户登录系统和退出的有关信息,

utmp保存了当前用户的每个用户的信息,wtmp记录了每个用户登录注销和系统的启动,关机的事件,lastlog记录了每个用户最后登录的信息记录。

wtmputmp文件都是二进制,不能使用cattail命令查看,但是可以使用who, w,users,last 等命令查看着两个文件的信息


who [参数]

  • -a 显示全部信息

  • -m 只显示当前终端的登录用户信息

  • -q 只显示当前登录到系统中的用户名称和数量,和其他参数共同使用的时候,其他参数将被忽略


Systemd统一管理所有 Unit 的启动日志。带来的好处就是可以只用journalctl一个命令,查看所有日志(内核日志和 应用日志)。

语法格式:journalctl [参数]

  • -k 查看内核日志

  • -b 查看系统本次启动的日志

  • -u 查看指定服务的日志

  • -n 指定日志条数

  • -f 追踪日志

  • --disk-usage 查看当前日志占用磁盘的空间的总大小

参考实例

  • 查看所有日志:journalctl

  • 查看httpd的日志:journalctl -u httpd

  • 查看最近发生的20条日志:journalctl -n 20

  • 追踪日志:journalctl -f

bash 快捷键

Bash 快捷键大全

vim ,vi总是卡死,终于找到原因了.

Alt+tab:切换程序

Alt+`:切换程序的不同窗口

vim下,有时候不小心按下了CTRL-S,会冻结终端的输入,表现为按什么键都没有反应,这时候按下CTRL-Q即可恢复.

CTRL-S: Suspend(XOFF),挂起.这个是冻结终端的stdin.要恢复可以按CTRL-Q.

常用的

| 快捷键 | 快捷键说明|

| --------------- | ----------- |

| CTRL-/ | 撤消操作,Undo. |

| ALT-B | 光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头). |

| ALT-F | 光标往前跳一个词(移动到光标所在词的末尾). |

| ALT-D | 删除光标所在位置到光标所在词的结尾位置的所有内容 |

| ALT-BASKSPACE | 删除光标所在位置到词开头的所有内容. |

| ALT-数值 | 这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数.如:[ALT-9,k]则光标位置会插入9k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT-9,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行9次操作. |

| ALT-< | 移动到历史记录中的第一行命令. |

| ALT-> | 移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空). |

| ALT-P | 从当前行开始向前搜索,有必要则向"上"移动,移动时,使用非增量搜索查找用户提供的字符串. |

| ALT-N | 从当前行开始向后搜索,如果有必要向"下"移动,移动时,使用非增量搜索查找用户提供的字符串. |

| ALT-? | 列出能够补全标志点前的条目. |

| ALT-C | 将光标所在位置的字母转为大写 |

| ALT-U | 将光标所在位置到词尾的所有字母转为大写. |

| ALT-L | 将光标位置到词尾的所有字母转为小写. |

| ALT-R | 取消所有变更,并将当前行恢复到在历史记录中的原始状态 |

| ALT-T | 当光标两侧都存在词的时候,交换光标两侧词的位置.如:abc <ALT-T>bcd -> bcd abc| |

| ALT-. | 使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念). |

| CTRL-A | 将光标移到行首(在命令行下) |

| CTRL-C | 中断,终结一个前台作业. |

| CTRL-E | 将光标移动到行尾(在命令行下) |

| CTRL-K | 在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符. |

| CTRL-U | 擦除从光标位置开始到行首的所有字符内容. |

| CTRL-W | CTRL-W 会删除从在光标处往回的第一个空白符之间的内容 |

| CTRL-Y | 将之前已经清除的文本粘贴回来(主要针对CTRL-UCTRL-W). |

| CTRL-N | 每按一次,是更接近的一条命令. |

| CTRL-P | 此快捷键召回的顺序是由近及远的召回, |

| ALT-* | 把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前. |

| CTRL-Q | Resume (XON).恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S. |

| CTRL-R | 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下).注意:按下之后,提示符会变成(reverse-i-search)'':输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令. |

| CTRL-S | Suspend(XOFF),挂起.这个是冻结终端的stdin.要恢复可以按CTRL-Q. |

| CTRL-T | 交换光标位置与光标的前一个位置的字符内容(在命令行下)|

| CTRL-\ | 退出.和CTRL-C差不多,也可能dump一个"core"文件到你的工作目录下(这个文件可能对你没用). |


terminal 快捷键

| 快捷键 | 快捷键说明 |

| ------------- | ---------------------- |

| Ctrl+Shift+t | new tab |

| Ctrl+Shift+n | new window |

| Ctrl+Shift+w | close tab |

| Ctrl+Shift+q | close window |

| Ctrl+page up | switch to previous tab |

| Ctrl+Shift+page up | switch to the left |

广泛的

| 快捷键 | 快捷键说明 |

| --------------- | ------ |

| CTRL-A | 将光标移到行首(在命令行下) |

| CTRL-B | 退格 (非破坏性的),这个只是将光标位置往回移动一个位置. |

| CTRL-C | 中断,终结一个前台作业. |

| CTRL-D | "EOF" (文件结尾:end of file).它用于表示标准输入(stdin)的结束. |

| CTRL-E | 将光标移动到行尾(在命令行下) |

| CTRL-F | 将光标向前移动一个字符(在命令行下) |

| CTRL-G | BEL.在一些老式打印机终端上,这会引发一个响铃.在xterm终端上可能是哔的一声. |

| CTRL-H | 擦除(Rubout)(破坏性的退格).在光标往回移动的时候,同时擦除光标前的一个字符. |

| CTRL-I | 水平制表符. |

| CTRL-J | 新行(换行[line feed]并到行首).在脚本中,也可能表示为八进制形式('\012')或十六进制形式('\x0a'). |

| CTRL-K | 垂直制表符(Vertical tab).在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符. |

| CTRL-L | 跳纸,换页(Formfeed),清屏.清空终端屏幕.在终端上,这个命令的作用和clear命令一样.但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾. |

| CTRL-M | 回车(Carriage return). |

| CTRL-N | 擦除从history缓冲区召回的一行文本(在命令行下).如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令. |

| CTRL-O | 产生一个新行(在命令行下). |

| CTRL-P | 从history缓冲区召回上一次的命令(在命令行下).此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话). |

| CTRL-Q | Resume (XON).恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S. |

| CTRL-R | 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下).注意:按下之后,提示符会变成(reverse-i-search)'':输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令. |

| CTRL-S | Suspend(XOFF),挂起.这个是冻结终端的stdin.要恢复可以按CTRL-Q.|

| CTRL-T | 交换光标位置与光标的前一个位置的字符内容(在命令行下).比如:echo $var;,假设光标在a上,那么,按下C-T之后,va将会交换位置:echo $avr;. |

| CTRL-U | 擦除从光标位置开始到行首的所有字符内容.在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入. |

| CTRL-V | 在输入文本的时候,按下C-V之后,可以插入控制字符.比如:echo -e '\x0a';echo <CTRL-V><CTRL-J>;这两种效果一样.这点功能在文本编辑器内非常有效. |

| CTRL-W | 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容.在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符. |

| CTRL-X | 在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中. |

| CTRL-Y | 将之前已经清除的文本粘贴回来(主要针对CTRL-UCTRL-W). |

| CTRL-Z | 暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符. |

| CTRL-\ | 退出.和CTRL-C差不多,也可能dump一个"core"文件到你的工作目录下(这个文件可能对你没用). |

| CTRL-/ | 撤消操作,Undo. |

| CTRL-_ | 撤消操作. |

| CTRL-xx | 在行首和光标两个位置间进行切换,此处是两个"x"字符. |

| ALT-B | 光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头). |

| ALT-F | 光标往前跳一个词(移动到光标所在词的末尾). |

| ALT-D | 删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词). |

| ALT-BASKSPACE | 删除光标所在位置到词开头的所有内容. |

| ALT-C | 将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写). |

| ALT-U | 将光标所在位置到词尾的所有字母转为大写. |

| ALT-L | 将光标位置到词尾的所有字母转为小写. |

| ALT-R | 取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行). |

| ALT-T | 当光标两侧都存在词的时候,交换光标两侧词的位置.如:abc <ALT-T>bcd -> bcd abc| |

| ALT-. | 使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念). |

| ALT-_ | 同ALT-.. |

| ALT-数值 | 这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数.如:[ALT-10,k]则光标位置会插入10k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT--10,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行10次操作. |

| ALT-< | 移动到历史记录中的第一行命令. |

| ALT-> | 移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空). |

| ALT-P | 从当前行开始向前搜索,有必要则向"上"移动,移动时,使用非增量搜索查找用户提供的字符串. |

| ALT-N | 从当前行开始向后搜索,如果有必要向"下"移动,移动时,使用非增量搜索查找用户提供的字符串. |

| ALT-CTRL-Y | 在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词).如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展).负的参数将插入冲前一个命令的结尾开始的第n个词.参数n通过M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第0个词(命令本身). |

| ALT-Y | 轮询到删除环,并复制新的顶端文本.只能在yank[CTRL-Y]或者yank-pop[M-Y]之后使用这个命令. |

| ALT-? | 列出能够补全标志点前的条目. |

| ALT-* | 把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前.|

| ALT-/ | 试图对标志点前的文本进行文件名补全.[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目. |

| ALT-~ | 把标志点前的文本当成用户名并试图进行补全.[CTRL-X,~]列出可以作为用户名补全标志点前的条目. |

| ALT-$ | 把标志点前的文本当成Shell变量并试图进行补全.[CTRL-X,$]列出可以作为变量补全标志点前的条目. |

| ALT-@ | 把标志点前的文本当成主机名并试图进行补全.[CTRL-X,@]列出可以作为主机补全标志点前的条目. |

| ALT-! | 把标志点前的文本当成命令名并试图进行补全.进行命令名补全时会依次使用别名,保留字,Shell函数,shell内部命令,最后是可执行文件名.[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目. |

| ALT-TAB | 把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全.|

| ALT-{ | 进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用. |


在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符.从一个shell中退出 (类似于exit).如果没有字符存在,CTRL-D 则会登出该会话.在一个xterm窗口中,则会产生关闭此窗口的效果.

CTRL-K

在脚本中,也可能表示为八进制形式('\013')或十六进制形式('\x0b').在脚本中,CTRL-K可能会有不一样的行为,下面的例子给出其不一样的行为:


#!/bin/bash

## 一个`CTRL-K`垂直制表符的例子

var=$'\x0aBottom Line\x0bTop line\x0a'

## 直接输出

echo "$var"

## 使用col来过滤控制字符

echo "$var" | col

## 上面的显示将会不一样

exit 0

RFC

2021/04/16  阅读:99  主题:默认主题

作者介绍

RFC