Linux 零散工具与方法
Table of Contents
1 让 rm 更安全
运行 rm *.txt
前执行 echo rm *.txt
或 echo *.txt
看一下匹配结果。
如果要递归删除文件和目录,则可以使用 find
代替 rm -r
例如:
find . -name "*.txt" -print
然后,如果结果符合预期,把 -print
改为 -delete
:
find . -name "*.txt" -delete
2 用 watch 刷新命令执行结果
基本所有的发行版都带有 watch
,它可以自动重复执行命令并显示执行结果。
- 命令格式:
watch [args] [cmd]
- 命令参数:
-n
或--interval
: 指定间隔的时间,如果缺省,每 2 秒运行一次指令。-d
或--differences
: 会高亮显示不同的部分。-d=cumulative
: 以第一次执行为基准,高亮显示所有变动过的地方都。-t
或-no-title
: 关闭 watch 命令在顶部的时间间隔,命令,当前时间的输出。-h
或--help
: 查看帮助文档。
3 查看磁盘使用情况
fdisk -l
和 parted -l
最详细。
df [options] device
显示文件系统的磁盘使用情况,空间数值计算默认使用 1k block:
-l
: 仅显示本地文件系统的相关信息。-h
: 输出部分的空间数值以 M 计算。-i
: 输出部分的空间数值以 inode 计算。
lsblk
可以查看磁盘信息,但看不到使用情况。
4 查看文件与文件夹大小
du [option] [file [file]...]
显示每个文件和目录的磁盘使用空间:
-a
或-all
: 显示目录中个别文件的大小。-b
或-bytes
: 显示目录或文件大小时,以 byte 为单位。-c
或--total
: 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。-k
或--kilobytes
: 以 KB ( 1024 bytes ) 为单位输出。-m
或--megabytes
: 以 MB 为单位输出。-s
或--summarize
: 仅显示总计,只列出最后加总的值。-S
或--separate-dirs
: 显示个别目录的大小时,并不含其子目录的大小。-h
或--human-readable
: 以 K,M,G 为单位,提高信息的可读性。-x
或--file-system
: 以一开始处理时的文件系统为准,略过其它不同的文件系统目录。-D
或--dereference-args
: 显示指定符号链接的源文件大小。-H
或--si
: 与-h
参数相同,但是 K,M,G 是以 1000 为换算单位。-X <file>
或--exclude-from=<file>
: 指定的 ( 目录内的 ) 文件中记录了要被排除的文件,要和--exclude=( <file> | <dir> )
区分开。--exclude=( <file> | <dir> )
: 略过指定的目录或文件。-L<symbolLink>
或--dereference<symbolLink>
: 显示符号链接的源文件大小。-l
或--count-links
: 重复计算硬件链接的文件。
一般只用 du -sh
。
5 设置全局代理
全局的 http 代理:
export HTTP_PROXY=http://192.168.2.10:10811
export HTTPS_PROXY=http://192.168.2.10:10811
export http_proxy=http://192.168.2.10:10811
export https_proxy=http://192.168.2.10:10811
注意: 有些程序使用大写的环境变量,有些程序使用小写的环境变量,所以最好大小写都配置一下。当然,还有些程序不使用这些环境变量,比如 Firefox。
如果要持久化配置可以把上面的代码块写在 ~/.bashrc 里面,重启系统后全局生效。
6 top 命令
top 命令的第五行最后一个指标 avail Mem
的含义是: 不发生 swap 的条件下,可分配给程序的内存大小。
VIRT 是进程使用的虚拟内存。RES 进程使用的未被 swap 的物理内存。SHR 共享内存大小。
7 Shell 重定向中 2>&1 的含义
$ command >file 2>&1 $ command >>file 2>&1
放在 > 后面的 & ,表示重定向的目标不是一个文件,而是文件描述符,内置的文件描述符有:
1 => stdout 2 => stderr 0 => stdin
即, 2>1 代表将 stderr 重定向到当前路径下文件名为 1 的普通文件中,而 2>&1 代表将 stderr 重定向到文件描述符为 1 的文件 (即 /dev/stdout) 中,这个文件就是 stdout 在文件系统中的映射。
此外,以下三种写法等价 (前两行的 &> 与 >& 视作整体):
&>file >&file >file 2>&1
注意 2>&1 一定要放在 stdout 重定向 >file 的后面。
两者顺序不一样,效果也不一样:
find /etc -name .bashrc >list 2>&1 find /etc -name .bashrc 2>&1 >list
第一条: 先将 stdout 的内容重定向到文件,此时文件 list 就是这个程序的 stdout,再将 stderr 重定向到 stdout,也就是文件 list。
可以近似地看成指针关系:
# 先执行 >list stdout -> list stderr -> stderr # 再执行 2>&1 stdout -> list stderr -> stdout (-> list)
第二条: 先将要输出到 stderr 的内容重定向到 stdout ,此时会产生一个 stdout 的拷贝,也就是有了 2 个 stdout。旧的 stdout 依旧负责程序的 stdout,新的 stdout 负责输出程序的 stderr。两个 stdout 相互独立互不影响。
# 先执行 2>&1 stdout -> stdout stderr -> new_stdout # 再执行 >list stdout -> list stderr -> new_stdout