以前用 Linux,都是偶尔上去处理一下服务部署和一些配置,搭建一下环境,所以对于 Linux 的使用,还处于比较基础的阶段,只会一些基础的命令就好了,有一些命令甚至没记住,用的时候再来翻一下。
最近换了新工作,开始频繁地接触 Linux 了,应该说需要具备能够在 Linux 下开发的能力,觉得很是刺激,之前一直没这样的机会,现在机会来了,但是也暴露了在这一块的不足。最近确实是熟悉了很多东西,现在来整理一下在 Linux 下工作,我们必须会的命令!我碰到了就来下来。

这里不再记录一些基本的概念的东西,或者是最基础的比如 ls 啊之类的命令了。只记录一些具有实际用途,需要记下来,或者我之前经常会忘记参数的命令或操作。

基本操作

这里是最基本的 Linux 操作

文件/目录操作

  • mkdir - 创建目录

    • 语法:mkdir [参数] [目录名]
    • 参数:
      • -m<目标属性> 或 —mode<目标属性>:建立目录的同时设置目录的权限,如 -m 777
      • -p 或 --parents:若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录
  • mv - 修改文件名/自改目录名/移动目录
    mv 命令的不同使用方式会有不同的效果

    • 语法:
      • mv [文件名] [文件名]:将源文件名(前)改为目标文件名(后)
      • mv [文件名] [目录名]:将文件移动到目标目录
      • mv [目录名] [目录名]:目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
      • mv [目录名] [文件名]:出错,没有这个操作
    • 参数:
      • -i: 先询问是否覆盖旧文件
      • -f: 不指示覆盖某已有的目标文件
  • rm - 删除文件/目录

    • 语法:rm [参数] [名称]...
    • 参数:
      • -i:删除前逐一询问
      • -f:直接删除不进行询问
      • -r:递归删除目录
  • cp - 复制文件/目录

    • 语法:cp [参数] [源文件/目录] [目标文件/目录]
    • 参数:
      • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于-dpR参数组合。
      • -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
      • -f:不询问文件覆盖
      • -i:覆盖目标文件之前询问是否覆盖
      • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中
      • -r:若给出的源文件是一个目录文件,递归复制子目录和文件
      • -l:不复制文件,只是生成链接文件。
  • touch - 新建文件/修改文件或者目录的时间属性

    • 语法:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>] [文件或目录...]
    • 参数:
      • -a:改变文件的读取时间记录
      • -m:改变文件的修改时间记录
      • -c:如果文件不存在不建立新的文件,与 --no-create 的效果一样
      • -f:不使用,是为了与其他 unix 系统的相容性而保留
      • -r:使用参考文件的时间记录,与 --file 的效果一样
      • -d:设定时间与日期,可以使用各种不同的格式
      • -t:设定档案的时间记录,格式与 date 指令相同
      • --no-create:不会建立新档案
      • --help:列出指令格式
      • --version:列出版本讯息
    • 例子:

        # 文件不存在时
        touch exampleFile    #创建一个名为新的空白文件
      
        # 文件存在时
        $ touch exampleFile                #修改文件时间属性为当前系统时间
        $ ls -l exampleFile                #查看文件的时间属性
      
  • ln - 创建文件同步链接
    当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用 ln 命令链接(link)它就可以,不必重复的占用磁盘空间。

    • 语法:ln [参数] [源文件或目录] [目标文件或目录]
    • 参数:
      • -b:删除、覆盖以前建立的链接
      • -d:建立硬连接
      • -f:强制执行,不论文件或目录是否存在
      • -i:文件存在则提示用户是否覆盖
      • -n:把符号链接视为一般目录
      • -s:建立软链接(符号链接)
      • -v:显示指令执行过程
    • 例子:

      # 创建链接
      ln /usr/local/example.txt /usr/exmaple/example.txt
      
      # 创建软链,将 /usr/exmaple/a 软链到 /usr/me/abc
      ln -s /usr/exmaple/a /usr/me/abc
      
  • cat - 打印文件内容

    • 语法:cat [参数] [file]
    • 参数:主要都是一些展示相关的参数
      • -n 或 --number:由 1 开始对所有输出的行数编号。
      • -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
      • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
      • -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
      • -E 或 --show-ends: 在每行结束处显示 $。
      • -T 或 --show-tabs: 将 TAB 字符显示为 ^I。
      • -e : 等价于 -vE
      • -A 或 --show-all:等价于 -vET
      • -e:等价于 -vE 选项;
      • -t:等价于 -vT 选项;
  • tail - 查看文件尾部内容

    • 语法:tail [参数] [文件]
    • 参数:
      • -f:循环读取
      • -q:不显示处理信息
      • -v:显示详细的处理信息
      • -c<数目>:显示的字节数
      • -n<行数>:显示行数
      • --pid=PID:与-f合用,表示在进程 ID,PID 死掉之后结束
      • -q 或 --quiet--silent:从不输出给出文件名的首部
      • -s 或 --sleep-interval=S:与-f合用,表示在每次反复的间隔休眠 S 秒
    • 例子:

      # 显示 example.log 最尾部的内容,并且不断刷新。可以用于查看日志变化。
      tail -f example.log
      
      # 显示最后10个字符
      tail -c 10 example.log
      
  • chmod - 设置文件权限

    • 语法:chmod [参数] [mode] [file]...
    • 参数:
      • -c:若该文件权限确实已经更改,才显示其更改动作
      • -f:若该文件权限无法被更改也不要显示错误讯息
      • -v:显示权限变更的详细资料
      • -R:对目前目录下的所有文件与子目录进行相同的权限变更
    • 例子:
      chmod 777 file
      chmod ug=rwx,o=x file

用户权限

  • 切换用户
    • 语法:su - <user>
    • 参数:
      • user:用户,没有默认切换到 root 用户
    • 例子:
      # 切换到 root,询问 root 密码
      su - 
      # 切换到 user1,询问 user1 密码
      su - user1
      # 切换到 root,无需询问密码(询问当前 user 密码)
      sudo su -
      

定时任务

  • 查看定时任务
    crontab -l

  • 编辑定时任务
    crontab -e

  • 启动 crontab 任务

    /sbin/service crond start
    service crond start
    service cron restart
    
  • 查看 cron 服务是否已经运行
    ps -ax | grep cron

  • 查看定时任务日志
    默认位于 /var/log/cron 文件:

    tail -f /var/log/cron
    cat /var/log/cron | grep "sh"
    

日志操作

  • 搜索日志
    cat 输出拼接 grep 搜索
    cat error.log | grep 'foo'
    cat error.log | grep -C 5 'foo'  # 显示file文件里匹配foo字串那行以及上下5行
    cat error.log | grep -B 5 'foo'  # 显示foo及前5行
    cat error.log | grep -A 5 'foo'  # 显示foo及后5行
    

Vi/Vim 操作

  • 跳到开头
    0
    gg

  • 跳到末尾
    G

  • 跳到指定行
    ngg
    nG
    :n
    n为行数

  • 移动光标
    按「ctrl」+「b」:屏幕往“后”移动一页。
    按「ctrl」+「f」:屏幕往“前”移动一页。
    按「$」:移动到光标所在行的“行尾”。
    按「^」:移动到光标所在行的“行首”

  • 删除光标所在行
    dd

  • 复制光标所在行到缓冲区
    yy

  • 光标开启选择
    v

  • 剪切
    c

  • 粘贴
    p

Git 操作

一些实用的 Git 操作

基本操作

  • 查看历史版本
    语法:git log
    查看指定文件的历史版本:git log <filename>

  • 删除一个远程分支
    先删除本地的远程分支,然后推送到远程。
    例如,删除远程 origin/confshop 分支:

    # 删除分支
    git branch -r -d origin/confshop
    # 推送到远程
    git push origin :confshop
    
  • git stash 缓存修改

    # 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
    git stash
    # 恢复之前缓存的工作目录
    git stash pop
    

撤销操作

  • 取消已经暂存的文件
    语法:git reset HEAD <filename>...
    如果撤销所有已暂存文件:git reset HEAD .

  • 撤销还未暂存的文件的修改
    语法:git checkout -- <filename>
    如果撤销所有:git checkout .

  • 修改最后一次提交
    语法:git commit --amend
    例子:

    # 提交
    git commit -m 'initial commit'
    # 新增了一个刚才忘了提交的文件
    git add forgotten_file
    # 修改最后一次提交
    git commit --amend
    
  • 撤销 git commit 的提交

    # 可以回退到某个 commit 并保存之前的修改,之后的修改进入暂存区可以用于再次提交
    git reset --soft <commit_id>
    # 回退到某个 commit 不保留之前的修改
    git reset --hard <commit_id>
    

回滚操作

  • 切换到某个 tag 标签版本
    切换到某个 tag 标签版本:git checkout <tag>
    说明上线前打 tag 的重要性。

  • 撤销到指定版本
    先查看历史版本,然后指定 ID 回滚到指定版本:

    # 查看历史版本
    git log <filename>
    # 回滚到指定的 commitID
    git checkout <commitID> <filename>
    
  • 删除最后一次远程提交(保留历史记录,生成新的提交)

    # 删除当前指针指向的提交(最后一次提交)
    git revert HEAD
    # 推送到远程
    git push origin master
    
  • 删除最后一次远程提交(不保留放弃的提交记录,将 HEAD 指针指到指定提交)

    # 重置到当前提交的前一次提交,符号 ^ 表示前一次提交
    git reset --hard HEAD^
    # 推送到远程
    git push origin master -f
    

Docker 操作

  • docker exec - 进入 Docker 容器
    • 语法:docker exec [参数] [container] [COMMAND] [ARG...]
    • 参数:
      • -d:分离模式,在后台运行
      • -i:即使没有附加也保持 STDIN 打开
      • -t:分配一个伪终端
      • -c: 带上要执行的命令
    • 例子:在容器 php-fpm 中开启一个交互模式的终端:docker exec -it php-fpm bash
  • docker logs - 查看容器日志
    • 语法:docker logs [container]