#27 PATH 变量
Linux 2016-09-14用等于号隔开的一组路径,当我们执行一个命令时,会逐个检查这些路径,直到找到一个可以执行的文件。
coding in a complicated world
用等于号隔开的一组路径,当我们执行一个命令时,会逐个检查这些路径,直到找到一个可以执行的文件。
find 命令
-path-prune 不进入指定目录find . -path ./.git -prune -o -print
find . -path ./.git -prune -o -path ./build -prune
如果使用这几个参数,那么这个参数应该放到最前面
-depth-maxdepth 最大迭代深度-mindepth 最小迭代深度-name-iname-regex-iregexfind ./apps/api/ -maxdepth 3 -regextype "posix-egrep" -regex ".*/(vpc.py|server.py)"
# 空目录
find . -type d -empty
# 删除空目录
find . -type d -empty -delete
find . -type d -empty -exec rmdir {} \;
# 空文件
find . -type f -size 0c
find . -type f -empty
# 删除空文件
find . -type f -empty -exec rm {} \;
find . -type f -empty | xargs rm -f
# 如果文件名中有空格,0 是很有必要的
find . -type f -empty -print0 | xargs -0 rm -f
# 交互式
find . -type f -empty -ok rm -rf {} \;
选项:b, c, d (目录), p, f (文件), l (链接), s (Socket), D
用的多的还是目录和文件查找:
-type d-type f可用单位:b (块,512B,默认), c (Byte), w (字,2B), k , M, G
说明:+n, -n, n 分别表示大于,小于,等于。这个规则对 -amin (距离上次访问分钟数), -mtime (距离上次编辑天数), -gid, -inum (inode 数), -links (硬链数), -size, -uid, -used 有效。
大于/小于 10M 的文件:
find . -maxdepth 1 -type f -size +10M
find . -maxdepth 1 -type f -size -10M
# 列出小于三兆的 mp3 文件
find ~/Music -name '*.mp3' -size -3M -ls
# 精准匹配
find . -type f -perm 755 -iname "*.md" -exec chmod 644 {} \;
# 与:u g o 都有执行权限,最低权限判断
find . -type f -perm -111 -iname "*.md" -exec chmod 644 {} \;
# 或:u+x | g+x | o+x 满足一个条件即可
find . -type f -perm /111 -iname "*.md" -exec chmod 644 {} \;
# 这几个参数可以注意一下:
# -writable
# -readable
# -executable
find . -type f -executable -ls
创建和访问时间:
-amin 访问时间(分钟)-atime 访问时间(天)-cmin 创建时间(分钟)-ctime 创建时间(天)-mmin 修改时间(分钟)-mtime 修改时间(天)值得注意的是,上面按天为单位的那些时间过滤参数是按整除来算的,比如:find $HOME -mtime 0,表示一天以内,应为修改时间整除 24 小时为 0 的就是 24 小时以内。
还有一个参数 used,好像是文件状态变更之后的访问时间。
PS: 关于三种时间的差异,参考:2015-01-03 Linux 时间: atime, mtime, ctime。
-print 默认行为,打印文件名-ls 和 ls 命令一样,列出详细信息
find . -name '*.py' -ls
find $HOME -maxdepth 1 -type d -ls
# ls 输出非 ASCII 字符会转义,对中文环境不友好
find $HOME -maxdepth 1 -exec ls -ldh {} + | column -t
find . -maxdepth 1 -type f -name '*~' -delete
find . -maxdepth 1 -type f -name '*.pyc' -delete
find . -type f -exec chmod 644 {} \;
find . -name "*.php" -exec mv {} ~/codes/php \;
find . -type d -name "__pycache__" -exec rm -rf \;
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -type d -name "__pycache__" -depth +4 -print0 -exec rm -rf {} +
联合 xargs 命令:
find . -type d -empty -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find /var/cache/TheSunProject/ -type d -name "backup_*" -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find . -type d -mtime +30 -print0 | xargs -I dir -0 /bin/rm -rvf "dir" > /tmp/delete.log
大部分时候,我们都是用 \; 结果,但其实是有两种方案的:
-exec command ; Shell 中,分号需要转义 (\;)-exec command +echo "import sys; print('>>> %r <<<' % (sys.argv[1:], )); exit(2)" > /tmp/a.py
mkdir -p /tmp/a; cd /tmp/a; touch a " b c " "d;" e;
find . -type f -exec python /tmp/a.py {} \;
# >>> ['./ b c '] <<<
# >>> ['./e'] <<<
# >>> ['./a'] <<<
# >>> ['./d;'] <<<
echo $?
# 0
find . -type f -exec python /tmp/a.py {} +
# >>> ['./ b c ', './e', './a', './d;'] <<<
echo $?
# 1
参考手册中 OPERATORS 一节:
( expr ) 在 shell 中括号需要转义expr1 expr2expr1 -a expr2expr1 -and expr2expr1 -or expr2expr1 -o expr2-not expr! exprexpr1 , expr2find . -path ./.git -prune -false -o -type f
find . -name .git -prune -false -o -used -7 -type f -print
find . -type d \( -name .git -o -name node_modules -o -name build \) -prune -false -o -print
useradd 命令sudo useradd testuser -m -d /home/testuser -s /bin/bash
如果忘记加上 -m 参数,那就只好手动创建用户主目录(家目录):
sudo mkdir /home/testuser
sudo cp -rT /etc/skel /home/testuser
sudo chown -R testuser:testuser /home/testuser
此外,修改用户信息可以使用 usermod 命令:
sudo usermod -d /home/testuser
sudo usermod -s /bin/bash
$ tail -1 /etc/passwd
testuser:x:1001:1001::/home/testuser:/bin/bash
adduser 命令就相当于封装了比较低级的 useradd 命令,除了执行上面的全部操作,还提供更多的配置项。
# 创建普通的用户帐号
sudo adduser testuser2
# 创建不能用于登录的系统帐号
sudo adduser --system share
$ tail -2 /etc/passwd
testuser2:x:1002:1002:Test User,303,15812345678,02788888888,hello world:/home/testuser2:/bin/bash
share:x:131:65534::/home/share:/bin/false
“Test User,303,15812345678,02788888888,hello world” 这一串是创建过程中让你输入的 “全名”、“房间号”、“工作电话”、“家庭电话”、“其他”,最后逗号隔开,放在 /etc/passwd 文件的注释字段里面。
addgroup
groupadd
groupdel
groupmems
groupmod
groups
/proc/uptime 在开发中的一点应用
在一些和时间关联紧密的操作中,可要提防修改时间对系统运行的影响,这个时候 /proc/uptime 就派上用场了。
通过命令调用,随机生成密码。
我常用的方法:date | md5sum | base64 | head -c16; echo
使用 tailf 查看 MongoDB 日志时报错:无法添加 inotify 观察(达到了 inotify 观察数限制)
GRUB: GRand Unified Bootloader 统一引导程序
sudo vim /etc/default/grub
# 注释:GRUB_HIDDEN_TIMEOUT
# 修改:GRUB_HIDDEN_TIMEOUT= 秒数
sudo update-grub
记录一次 Linux 下清空磁盘的操作。
dd if=/dev/urandom of=/dev/sdb bs=1M status=progress
重装系统,记录安装过程,留给日后重建同样的开发环境作参考。
其实还有好多细节没有记录,日后慢慢补充完整。
安装 Ubuntu 16.04 时选择的分区方案。
| 挂载点 | 大小 | 意义 |
|---|---|---|
/ |
50GB | 根目录 |
/boot |
10GB | 启动目录 |
/home |
150GB | 用户主目录 |
/usr |
100GB | 程序分区 |
/var |
50GB | 变量文件目录 |
/tmp |
50GB | 临时文件目录 |
SWAP |
20GB | 交换分区 |