附录 A 命令行操作

Bash 文件查找、查看(内容、大小)、移动(重命名)、删除、创建、修改权限

Linux 命令行工具是非常强大的,命令行中的数据科学 https://www.datascienceatthecommandline.com/

optparsedocoptlittler 包提供了很多便捷的命令行工具,sysfs 在 R 中运行操作系统命令

如表A.1所示,总结了 R 和 Shell 命令的等价表示,下面以 list.files()ls 为例,介绍其等价的内容

表 A.1: R 和 Shell 命令的等价表示27
R Shell
查看文件 list.files() ls
查看目录 list.dirs() dir
目录层次 fs::dir_tree() tree
  1. 查看文件

    ls -a

    列出目录下所有文件

    ls -1 

    一行显示一个文件或文件夹

    ls -l 

    按从 aA-zZ 的顺序列出所有文件以及所属权限

    ls -rl 

    相比于 ls -l 文件是逆序排列

    ls -lh

    列出文件或文件夹(不包含子文件夹)的大小

    ls -ld 

    列出当前目录本身,而不是其所包含的内容

  2. 创建文件(夹)

    mkdir images

    创建文件用 touchtouch .Rprofile

    # 删除文件夹及子文件夹,递归删除
    rm -rf images/
    # 删除文件
    rm .Rprofile
  3. 移动文件

    在当前目录下

    # 移动文件夹 images 下的所有文件到 figures 文件夹下
    mv images/* figures/
    # images 文件夹移动到 figures 文件夹下
    mv images/ figures/
    # 移动特定的文件
    mv images/*.png figures/

    同一目录下有两个文件 R-3.5.1.tar.gz 未下载完整 和 R-3.5.1.tar.gz.1 完全下载

    # 删除 R-3.5.1.tar.gz
    rm R-3.5.1.tar.gz
    # 重命名 R-3.5.1.tar.gz.1 
    mv R-3.5.1.tar.gz.1  R-3.5.1.tar.gz
  4. 查看文件大小

    当前目录下各文件夹的大小, -h 表示人类可读的方式显示,如 Kb、Mb、Gb,-d 表示目录深度 du --human-readable --max-depth=1 ./

    du -h -d 1 ./
    # 对当前目录下的文件/夹 按大小排序
    du -sh * | sort -nr

A.1 终端模拟器

oh-my-zshZ Shell 扩展,开发在 Github 上 https://github.com/ohmyzsh/ohmyzsh

zsh 相比于 bash 在语法高亮、自动不全等方面

sudo dnf install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

RStudio 集成的终端支持 Zsh,操作路径 Tools -> Global Options -> Terminal, 见图 A.1

图 A.1: RStudio IDE 集成的 Zsh 终端模拟器

A.2 压缩和解压缩

最常见的压缩文件格式有 .tar.tar.gz.tar.bz2.zip.rar,分别对应于 Tar https://www.gnu.org/software/tar/、 Gzip https://www.gzip.org/ 、 Bzip2 https://www.bzip.org/ 、 UnZip/Zip http://www.info-zip.org 和 WinRAR https://www.rarlab.com/。 Tar 提供了基本的打包和解包工具,Gzip 和 Bzip2 在 Tar 打包的基础上提供了压缩功能, UnZip/Zip 是兼容 Windows 原生压缩/解压缩功能的程序,WinRAR 是广泛流行于 Windows 系统的压缩/解压缩收费软件,除了 WinRAR,其它都是免费甚至开源软件。 下面以 .tar.gz.tar.bz2 两种格式的压缩文件为例,介绍文件压缩和解压缩的操作,其它文件格式的操作类似28。WinRAR https://www.rarlab.com/ 是收费的压缩和解压缩工具,也支持 Linux 和 macOS 系统,鉴于它是收费软件,这里就不多展开介绍了,详情请见官网。

sudo dnf install -y tar gzip zip unzip 
# 将目录 ~/tmp 压缩成文件 filename.tar.gz
tar -czf **.tar.gz ~/tmp
# 将文件 filename.tar.gz 解压到目录 ~/tmp
tar -xzf **.tar.gz -C ~/tmp

 

sudo dnf install -y bzip2
# 将目录 ~/tmp 压缩成文件 filename.tar.bz2
tar -cjf filename.tar.bz2 ~/tmp
# 将文件 filename.tar.bz2 解压到目录 ~/tmp
tar -xjf filename.tar.bz2 -C ~/tmp

解压不带 tar 的 .gz 文件,比如 tex.eps.gz 解压后变成 tex.eps

gzip filename.gz -d ~/tmp

A.3 从源码安装 R

从源码编译 R 的需求大概有以下几点:

  1. 爱折腾的极客:玩配置,学习 make 相关工具和 Linux 世界的依赖
  2. 追求性能:如 LFS 支持Intel MKL 加速
  3. 环境限制:CentOS 或者红帽系统,自带的 R 版本比较落后
./configure --prefix=/opt/R/R-devel  --enable-R-shlib --enable-byte-compiled-packages \
--enable-BLAS-shlib --enable-memory-profiling --with-blas="-lopenblas"
R is now configured for x86_64-pc-linux-gnu

  Source directory:            .
  Installation directory:      /opt/R/R-devel

  C compiler:                  gcc  -g -O2
  Fortran fixed-form compiler: gfortran -fno-optimize-sibling-calls -g -O2

  Default C++ compiler:        g++ -std=gnu++11  -g -O2
  C++14 compiler:              g++ -std=gnu++14  -g -O2
  C++17 compiler:              g++ -std=gnu++17  -g -O2
  C++20 compiler:              g++ -std=gnu++2a  -g -O2
  Fortran free-form compiler:  gfortran -fno-optimize-sibling-calls -g -O2
  Obj-C compiler:               

  Interfaces supported:        X11, tcltk
  External libraries:          pcre2, readline, BLAS(OpenBLAS), curl
  Additional capabilities:     PNG, JPEG, TIFF, NLS, cairo, ICU
  Options enabled:             shared R library, shared BLAS, R profiling, memory profiling

  Capabilities skipped:        
  Options not enabled:         

  Recommended packages:        yes

A.4 安装软件

本书在后续章节中陆续用到新的 R 包,其安装过程不会在正文中呈现,下面以在 CentOS 8 上安装 sf 包为例介绍。首先需要安装一些系统依赖,具体安装哪些依赖参见 sf 包开发站点 https://github.com/r-spatial/sf

sudo dnf config-manager --set-disabled PowerTools # openblas-devel
sudo dnf copr enable/disable simc/stable # 获取 gdal-devel
sudo dnf install -y sqlite-devel gdal-devel \
  proj-devel geos-devel udunits2-devel

然后,在 R 命令行窗口中,执行安装命令:

install.packages('sf')

至此,安装完成。如遇本地未安装的新 R 包,可从其官方文档中找寻安装方式。如果你完全不知道自己应该安装哪些,考虑把下面的依赖都安装上

sudo dnf install -y \
  # magick
  ImageMagick-c++-devel \ 
  # pdftools
  poppler-cpp-devel \ 
  # gifski
  cargo 

软件包管理器架构图,各个命令分别担负什么样的功能,每个命令学习的一般路径是什么,而不是详细介绍每个命令、每个参数的使用,只需给出一个命令的完整使用即可,其余给出一个查询命令帮助手册

dnf copr
dnf config-manager

A.5 安装 R 包

  1. devtools 是开发 R 包的常用工具,同时具有很重的依赖,请看

    tools::package_dependencies('devtools',recursive=T)
    ## $devtools
    ##  [1] "usethis"     "callr"       "cli"         "covr"       
    ##  [5] "crayon"      "desc"        "digest"      "DT"         
    ##  [9] "ellipsis"    "glue"        "git2r"       "httr"       
    ## [13] "jsonlite"    "memoise"     "pkgbuild"    "pkgload"    
    ## [17] "rcmdcheck"   "remotes"     "rlang"       "roxygen2"   
    ## [21] "rstudioapi"  "rversions"   "sessioninfo" "stats"      
    ## [25] "testthat"    "tools"       "utils"       "withr"      
    ## [29] "processx"    "R6"          "assertthat"  "methods"    
    ## [33] "fansi"       "rex"         "yaml"        "grDevices"  
    ## [37] "rprojroot"   "htmltools"   "htmlwidgets" "magrittr"   
    ## [41] "crosstalk"   "promises"    "graphics"    "curl"       
    ## [45] "mime"        "openssl"     "prettyunits" "xopen"      
    ## [49] "brew"        "commonmark"  "knitr"       "purrr"      
    ## [53] "Rcpp"        "stringi"     "stringr"     "xml2"       
    ## [57] "evaluate"    "praise"      "clipr"       "fs"         
    ## [61] "gh"          "rematch2"    "whisker"     "lazyeval"   
    ## [65] "ini"         "base64enc"   "highr"       "markdown"   
    ## [69] "xfun"        "askpass"     "ps"          "later"      
    ## [73] "tibble"      "backports"   "sys"         "BH"         
    ## [77] "lifecycle"   "pillar"      "pkgconfig"   "vctrs"      
    ## [81] "utf8"

    其中,依赖关系见表 A.2

    表 A.2: devtools 的系统依赖
    [curl] [git2r] [openssl]
    Ubuntu libcurl-dev29 libgit2-dev libssl-dev
    CentOS libcurl-devel libgit2-devel openssl-devel
  1. sf 是处理空间数据的常用工具

    tools::package_dependencies('sf',recursive=T)
    ## $sf
    ##  [1] "methods"    "classInt"   "DBI"        "graphics"   "grDevices" 
    ##  [6] "grid"       "magrittr"   "Rcpp"       "stats"      "tools"     
    ## [11] "units"      "utils"      "e1071"      "class"      "KernSmooth"
    ## [16] "MASS"

    其主要的系统依赖分别是 GEOS 3.5.1, GDAL 2.2.2, PROJ 4.9.2

    sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
    sudo apt-get update
    sudo apt-get install -y libudunits2-dev libgdal-dev libgeos-dev libproj-dev 

    这样也同时解决了 udunits2rgdalrgeos 等 3个 R 包的系统依赖,其中 udunits2 使用如下命令安装

    install.packages("udunits2",configure.args='--with-udunits2-include=/usr/include/udunits2')
  2. 图形设备支持 cairo png jpeg tiff

    sudo apt-get install -y libcairo2-dev libjpeg-dev libpng-dev libtiff-dev 
  3. 图像处理 imagermagick

    sudo yum install fftw-devel # CentOS
    sudo apt-get install libfftw3-dev # Ubuntu

    在 Ubuntu 系统上安装最新的 libmagick++-dev 库

    sudo add-apt-repository -y ppa:opencpu/imagemagick
    sudo apt-get update
    sudo apt-get install -y libmagick++-dev 

    在 CentOS 系统上

    sudo yum install -y ImageMagick-c++-devel

    然后安装 R 包 install.packages(c('imager','magick'))

  4. rgl 是绘制真三维图形的重量级 R 包

    sudo apt-get install libcgal-dev libglu1-mesa-dev libx11-dev # Ubuntu
    sudo yum install mesa-libGLU mesa-libGLU-devel # CentOS

    然后安装 R 包

    install.packages('rgl')

    在 Ubuntu 系统上还可以这样安装

    sudo add-apt-repository ppa:marutter/rrutter3.5
    sudo apt-get update
    sudo apt-get install r-cran-rgl
  5. rJava 是 Java 语言和 R 语言之间实现通信交流的桥梁

    sudo apt-get install -y default-jdk
    sudo R CMD javareconf

    然后安装 rJava 包 install.packages("rJava")

  6. igraph 是网络数据分析的必备 R 包,为了发挥其最大性能,需要安装三个系统依赖

    sudo apt-get install -y libgmp-dev libxml2-dev libglpk-dev

    然后安装 R 包

    install.packages('igraph')
  7. gpuR 是基于 GPU 进行矩阵计算的扩展包,依赖 RcppEigen 确保安装 OpenCL 和 RViennaCL 或者 安装 Nvidia 驱动和 CUDA,使用 gpuRcudagputools 扩展包,下面安装指导来自其 Wiki

    # Install OpenCL headers
    sudo apt-get install opencl-headers opencv-dev
    
    # Install NVIDIA Drivers and CUDA
    sudo add-apt-repository -y ppa:xorg-edgers/ppa
    sudo apt-get update
    sudo apt-get install nvidia-346 nvidia-settings
  8. nloptrNLopt 的 R 语言接口,首先安装 NLopt 程序库 sudo apt-get install libnlopt-dev 然后安装 R 包install.packages('nloptr'),nloptr 被 700+ R 包依赖,如 lme4, spaMM, glmmTMB, rstanarm等。

  9. Rmpfr

    sudo apt-get install libmpfr-dev
    install.packages("Rmpfr")
  10. geojson

    sudo yum install jq-devel protobuf-devel
    install.packages(c('geojson','geojsonio','jqr','protolite'))
  11. lgcp

    sudo yum install bwidget
    install.packages(c('rpanel','lgcp'))
  12. ijtiff

    sudo yum install jbigkit-devel
    install.packages('ijtiff')
  13. webshot

    sudo apt install phantomjs
    install.packages("webshot")
  14. gifski

    sudo apt-get install cargo
    install.packages('gifski')

A.6 软件包管理器

A.6.1 dnf

A.6.1.1 清理升级后的 CentOS 8 系统内核

查找系统安装的内核

rpm -qa | sort | grep kernel
kernel-4.18.0-147.8.1.el8_1.x86_64
kernel-4.18.0-193.6.3.el8_2.x86_64
kernel-core-4.18.0-147.8.1.el8_1.x86_64
kernel-core-4.18.0-193.6.3.el8_2.x86_64
kernel-headers-4.18.0-193.6.3.el8_2.x86_64
kernel-modules-4.18.0-147.8.1.el8_1.x86_64
kernel-modules-4.18.0-193.6.3.el8_2.x86_64
kernel-tools-4.18.0-193.6.3.el8_2.x86_64
kernel-tools-libs-4.18.0-193.6.3.el8_2.x86_64

仅保留一个版本的内核,其它旧的内核都删除掉

sudo dnf remove $(dnf repoquery --installonly --latest-limit=-1 -q)
模块依赖问题

 问题 1: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBD-MySQL:4.046:8010020191114030811:073fa5fe-0.x86_64
 问题 2: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBI:1.641:8010020191113222731:16b3ab4d-0.x86_64
 问题 3: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-YAML:1.24:8010020191114031501:a5949e2e-0.x86_64
依赖关系解决。
=======================================================================================================================
 软件包                        架构                  版本                                 仓库                    大小
=======================================================================================================================
移除:
 kernel                        x86_64                4.18.0-147.8.1.el8_1                 @BaseOS                  0  
 kernel-core                   x86_64                4.18.0-147.8.1.el8_1                 @BaseOS                 58 M
 kernel-modules                x86_64                4.18.0-147.8.1.el8_1                 @BaseOS                 20 M

事务概要
=======================================================================================================================
移除  3 软件包

将会释放空间:78 M
确定吗?[y/N]: y
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                                                                                        1/1 
  删除    : kernel-4.18.0-147.8.1.el8_1.x86_64                                                                     1/3 
  运行脚本: kernel-4.18.0-147.8.1.el8_1.x86_64                                                                     1/3 
  删除    : kernel-modules-4.18.0-147.8.1.el8_1.x86_64                                                             2/3 
  运行脚本: kernel-modules-4.18.0-147.8.1.el8_1.x86_64                                                             2/3 
  运行脚本: kernel-core-4.18.0-147.8.1.el8_1.x86_64                                                                3/3 
  删除    : kernel-core-4.18.0-147.8.1.el8_1.x86_64                                                                3/3 
  运行脚本: kernel-core-4.18.0-147.8.1.el8_1.x86_64                                                                3/3 
  验证    : kernel-4.18.0-147.8.1.el8_1.x86_64                                                                     1/3 
  验证    : kernel-core-4.18.0-147.8.1.el8_1.x86_64                                                                2/3 
  验证    : kernel-modules-4.18.0-147.8.1.el8_1.x86_64                                                             3/3 

已移除:
  kernel-4.18.0-147.8.1.el8_1.x86_64                          kernel-core-4.18.0-147.8.1.el8_1.x86_64                 
  kernel-modules-4.18.0-147.8.1.el8_1.x86_64                 

完毕!

解决上述模块依赖问题的办法 是重置三个 Perl 模块

sudo dnf module reset perl-DBD-MySQL perl-YAML perl-DBI
依赖关系解决。
=======================================================================================================================
 软件包                      架构                       版本                         仓库                         大小
=======================================================================================================================
重置模块:
 perl-DBD-MySQL                                                                                                       
 perl-DBI                                                                                                             
 perl-YAML                                                                                                            

事务概要
=======================================================================================================================

确定吗?[y/N]: y
完毕!

A.6.2 apt

添加或删除 PPA (Personal Package Archive),比如在 Ubuntu 20.04 及之前的版本上安装新版 Inkscape

sudo add-apt-repository ppa:inkscape.dev/stable
sudo add-apt-repository --remove ppa:inkscape.dev/stable
sudo apt-get install build-essential # 修复依赖问题
sudo apt update # 更新资源列表
sudo apt-get upgrade # 更新软件包
sudo apt-get autoclean # 删除已卸的软件的备份
sudo apt-get clean # 删除已装或已卸的软件的备份
sudo apt-get autoremove --purge * # 推荐卸载软件的方式
apt-get list --upgradable # 列出可升级的包

找到并删除旧的内核

dpkg --list | grep linux-image
sudo apt-get purge linux-image-3.19.0-{18,20,21,25}
sudo update-grub2
# 搜索
apt-cache search octave | grep octave
# 查询
apt show octave
# 安装
sudo apt install octave
sudo apt-get install lsb-core
lsb_release -a
adduser cloud2016 # 添加用户
passwd cloud2016  # 用户密码设为 cloud
whereis sudoers   # 查找文件位置
chmod -v u+w /etc/sudoers # 给文件 sudoers 添加写权限
vim /etc/sudoers # 添加 cloud2016 管理员权限
chmod -v u-w /etc/sudoers # 收回权限

安装确认 openssh-server 服务

sudo apt install openssh-server
sudo /etc/init.d/ssh start
ps -aux | grep ssh

  1. CentOS 系统默认没有安装 tree 软件,需要先安装才能使用此命令 sudo dnf install -y tree↩︎

  2. zip 格式的文件需要额外安装 zip 和 unzip 两款软件实现压缩和解压缩。↩︎

  3. libcurl-dev 是一个虚包 virtual package,由 libcurl4-openssl-dev 或 libcurl4-nss-dev 或 libcurl4-gnutls-dev 实际提供,选择其中一个安装即可。↩︎