R语言-文件管理系统操作
前言
R语言作为脚本语言,有一套文件系统管理的功能函数,和其他编程语言一样,都能对文件系统进行操作,包括文件操作和目录操作,相关函数都定义在base包中。
目录
-
1.文件系统介绍
-
2.文件系统操作函数概览
-
3.目录操作
-
4.文件操作
-
5.几个特殊的目录
1. 文件系统介绍
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
2. 文件系统操作函数概览
# 文件操作
dir.create:新建一个文件夹
list.dirs:显示目录下的文件夹
list.files:显示目录下的文档
file.create:文档创建
file.exists:判断文档是否存在
file.remove:文档删除
file.rename:重命名
file.append:文档添加
file.copy:文档复制
file.symlink(from, to)
file.show:显示文档内容
file.info:显示文档信息
file.edit:编辑文档
zip: 压缩文件
unzip: 解压缩文件
# 相关命令简介
rm(list=ls())
path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'
setwd(path)
cat("file A\n", file="A") #创建一个文件A,文件内容是'file A','\n'表示换行,这是一个很好的习惯
cat("file B\n", file="B") #创建一个文件B
file.append("A", "B") #将文件B的内容附到A内容的后面,注意没有空行
file.create("A") #创建一个文件A, 注意会覆盖原来的文件
file.append("A", rep("B", 10)) #将文件B的内容复制10便,并先后附到文件A内容后
file.show("A") #新开工作窗口显示文件A的内容
file.copy("A", "C") #复制文件A保存为C文件,同一个文件夹
dir.create("tmp") #创建名为tmp的文件夹
file.copy(c("A", "B"), "tmp") #将文件夹拷贝到tmp文件夹中
list.files("tmp") #查看文件夹tmp中的文件名
unlink("tmp", recursive=F) #如果文件夹tmp为空,删除文件夹tmp
unlink("tmp", recursive=TRUE) #删除文件夹tmp,如果其中有文件一并删除
file.remove("A", "B", "C") #移除三个文件
3. 目录操作
-
3.1 查看目录
# 当前的目录 > getwd() [1] "C:/Users/abdata/Desktop/get_pm_data" # 查看当前目录的子目录 > list.dirs() [1] "." "./test" # 查看当前目录的子目录和文件。 > dir() [1] "pm_2014_1.RData" "pm_2014_10.RData" [3] "pm_2014_11.RData" "pm_2014_12.RData" [5] "test" # 查看指定目录的子目录和文件。 > dir(path="C:/Users/abdata/Desktop/get_pm_data/test") [1] "test.txt" "test_test" # 只列出以'pm_2014'开头的子目录或文件 > dir(path="C:/Users/abdata/Desktop/get_pm_data", pattern='^pm_2014') [1] "pm_2014_1.RData" "pm_2014_10.RData" [3] "pm_2014_11.RData" "pm_2014_12.RData" [5] "pm_2014_2.RData" "pm_2014_3.RData" # 列出目录下所有的目录和文件,包括隐藏文件。 > dir(path="C:/Users/abdata/Desktop/get_pm_data",all.files=TRUE) [1] "." ".." [3] "pm_2014_1.RData" "pm_2014_10.RData" [5] "pm_2014_11.RData" "pm_2014_12.RData" [7] "test" # 查看当前目录的子目录和文件,同dir()函数。 > list.files() [1] "pm_2014_1.RData" "pm_2014_10.RData" [3] "pm_2014_11.RData" "pm_2014_12.RData" [5] "test" > list.files(".",all.files=TRUE) # 查看当前目录权限 > file.info(".") size isdir mode mtime ctime . 0 TRUE 777 2017-01-18 17:43:27 2016-11-15 20:59:41 atime exe . 2017-01-18 17:43:27 no # 查看指定目录权限 > file.info("./test") size isdir mode mtime ./test 0 TRUE 777 2017-01-18 17:45:43 ctime atime exe ./test 2017-01-18 17:43:23 2017-01-18 17:45:43 no
-
3.2 创建目录
# 在当前目录下,新建一个目录 > dir.create("/test/test1") # 指定目录下,创建新目录 > dir.create("C:/Users/abdata/Desktop/get_pm_data/test/test1") > list.dirs() [1] "." "./test" "./test/test_test" [4] "./test/test1" "./test2" # 创建一个3级子目录./test1/test1_1/test1_2 # 直接创建,出错(win和linux目录路径写法不同) > dir.create(path="/test1/test1_1/test1_2") 或 dir.create(path="./test1/test1_1/test1_2") # 递归创建,成功 > dir.create(path="./test1/test1_1/test1_2",recursive = TRUE) > list.dirs() [1] "." "./test" [3] "./test/test_test" "./test/test1" [5] "./test1" "./test1/test1_1" [7] "./test1/test1_1/test1_2" "./test2" # 通过系统命令查看目录结构 > system("tree") 卷 系统 的文件夹 PATH 列表 卷序列号为 00000034 E6A9:F9BA C:. ├─test │ ├─test1 │ └─test_test ├─test1 │ └─test1_1 │ └─test1_2 └─test2
-
3.3 检查目录是否存在
# 目录存在 > file.exists(".") [1] TRUE > file.exists("./test/test1") [1] TRUE # 目录不存在 > file.exists("./test3") [1] FALSE
-
3.4 检查和修改目录的权限
> df<-dir(full.names = TRUE) # 检查文件或目录是否存在,mode=0。 > file.access(df, 0) == 0 ./pm_2016_7.RData ./pm_2016_8.RData ./pm_2016_9.RData TRUE TRUE TRUE ./test ./test1 ./test2 TRUE TRUE TRUE # 检查文件或目录是否可执行,mode=1,目录为可以执行 > file.access(df, 1) == 0 ./pm_2016_7.RData ./pm_2016_8.RData ./pm_2016_9.RData FALSE FALSE FALSE ./test ./test1 ./test2 TRUE TRUE TRUE # 检查文件或目录是否可写,mode=2。 > file.access(df, 2) == 0 ./pm_2016_7.RData ./pm_2016_8.RData ./pm_2016_9.RData TRUE TRUE TRUE ./test ./test1 ./test2 TRUE TRUE TRUE # 检查文件或目录是否可读,mode=4。 > file.access(df, 4) == 0 ./pm_2016_7.RData ./pm_2016_8.RData ./pm_2016_9.RData TRUE TRUE TRUE ./test ./test1 ./test2 TRUE TRUE TRUE # 修改目录权限,所有用户只读(linux-?) > Sys.chmod("./test", mode = "0555", use_umask = TRUE) # 查看目录完整信息,mode=555 > file.info("./test") # create目录不可以写 > file.access(df, 2) == 0
-
3.5 对目录重命名
# 对test目录重命名 > file.rename("test", "tmp") [1] TRUE # 查看目录 > dir() [1] "pm_2014_1.RData" "pm_2014_10.RData" "pm_2014_11.RData" [4] "tmp" "test1" "test2"
-
3.6 删除目录
# 删除tmp目录 > unlink("tmp", recursive = TRUE) # 查看目录 > dir() [1] "pm_2014_1.RData" "pm_2014_10.RData" "pm_2014_11.RData" [4] "test1" "test2"
-
3.7 拼接目录字符串
# 拼接目录字符串 > file.path("test1","test1_1","test1") [1] "test1/test1_1/test1" > dir(file.path("test1","test1_1")) [1] "test1_2"
-
3.8 获取最底层的子目录名
# 当前目录 > getwd() [1] "C:/Users/abdata/Desktop/get_pm_data" # 最底层子目录 > dirname("C:/Users/abdata/Desktop/get_pm_data/test1/test1_1/test1_2/abdata.txt") [1] "C:/Users/abdata/Desktop/get_pm_data/test1/test1_1/test1_2" # 最底层子目录或文件名 > basename(getwd()) [1] "get_pm_data" > basename("C:/Users/abdata/Desktop/get_pm_data/test1/test1_1/test1_2/abdata.txt") [1] "abdata.txt"
-
3.9 转换文件扩展路径
# 转换~为用户目录 > path.expand("~/tmp") [1] "C:/Users/abdata/Documents/tmp"
-
3.10 标准化路径,用来转换win或linux的路径分隔符
# linux > normalizePath(c(R.home(), tempdir())) [1] "C:\\Program Files\\R\\R-3.2.0" [2] "C:\\Users\\abdata\\AppData\\Local\\Temp\\Rtmp8S0U8a" # win > normalizePath(c(R.home(), tempdir())) [1] "C:\\Program Files\\R\\R-3.2.0" [2] "C:\\Users\\abdata\\AppData\\Local\\Temp\\Rtmp8S0U8a" # 短路径,缩减路径的显示长度,只在win中运行。 # win > shortPathName(c(R.home(), tempdir())) [1] "C:\\PROGRA~1\\R\\R-32~1.0" [2] "C:\\Users\\abdata\\AppData\\Local\\Temp\\RTMP8S~1"
4. 文件操作
-
4.1 查看文件
# 查看当前目录的子目录和文件。 > dir() [1] "abdata.txt" "pm_2014_1.RData" "pm_2014_10.RData" [4] "pm_2014_11.RData" "pm_2014_12.RData" "pm_2014_2.RData" [7] "test1" "test2" "tmp" # 检查文件是否存在 > file.exists("pm_2014_1.RData") [1] TRUE # 文件不存在 > file.exists("pm_2014_1.RData111") [1] FALSE # 查看文件完整信息 > file.info("pm_2014_1.RData") size isdir mode mtime pm_2014_1.RData 66346 FALSE 666 2016-11-15 21:33:49 ctime atime exe pm_2014_1.RData 2017-01-17 19:16:37 2017-01-17 19:16:37 no # 查看文件访问权限,存在 > file.access("pm_2014_1.RData",0) pm_2014_1.RData 0 # 不可执行 > file.access("pm_2014_1.RData",1) pm_2014_1.RData -1 # 可写 > file.access("pm_2014_1.RData",2) pm_2014_1.RData 0 # 可读 > file.access("pm_2014_1.RData",4) pm_2014_1.RData 0 # 查看一个不存在的文件访问权限,不存在 > file.access("pm_2014_1.RData111") pm_2014_1.RData111 -1
-
4.2 判断是文件还是目录
# 判断是否是目录 > file_test("-d", "pm_2014_1.RData") [1] FALSE > file_test("-d", "test1") [1] TRUE # 判断是否是文件 > file_test("-f", "pm_2014_1.RData") [1] TRUE > file_test("-f", "test1") [1] FALSE
-
4.3 创建文件
# 创建一个空文件 A.txt > file.create("A.txt") [1] TRUE # 创建一个有内容的文件 B.txt > cat("file B\n", file = "B.txt") > dir() [1] "A.txt" "B.txt" "create" "readme.txt" # 打印A.txt > readLines("A.txt") character(0) # 打印B.txt > readLines("B.txt") [1] "file B"
-
4.4 把文件B.txt的内容,合并到 A.txt。
# 合并文件 > file.append("A.txt", rep("B.txt", 10)) [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE # 查看文件内容 > readLines("A.txt") [1] "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B"
-
4.5 把文件A.txt复制到文件C.txt
# 复制文件 > file.copy("A.txt", "C.txt") [1] TRUE # 查看文件内容 > readLines("C.txt") [1] "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B"
-
4.6 修改文件权限
# 修改文件权限,创建者可读可写可执行,其他人无权限 > Sys.chmod("A.txt", mode = "0700", use_umask = TRUE) # 查看文件信息 > file.info("A.txt") size isdir mode mtime ctime atime uid gid uname grname A.txt 70 FALSE 700 2013-11-14 12:55:18 2013-11-14 12:57:39 2013-11-14 12:55:26 1000 1000 conan conan
-
4.7 文件重命名
# 给文件A.txt重命名为AA.txt > file.rename("A.txt","AA.txt") [1] TRUE > dir() [1] "AA.txt" "B.txt" "create" "C.txt" "readme.txt"
-
4.8 硬连接和软连接
硬连接,指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接,也叫符号连接(Symbolic Link)。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。硬连接和软连接,只在Linux系统中使用。
# 硬连接
> file.link("readme.txt", "hard_link.txt")
[1] TRUE
# 软连接
> file.symlink("readme.txt", "soft_link.txt")
[1] TRUE
# 查看文件目录
> system("ls -l")
-rwx------ 1 conan conan 70 Nov 14 12:55 AA.txt
-rw-rw-r-- 1 conan conan 7 Nov 14 12:51 B.txt
dr-xr-xr-x 2 conan conan 4096 Nov 14 08:36 create
-rw-rw-r-- 1 conan conan 70 Nov 14 12:56 C.txt
-rw-rw-r-- 2 conan conan 7 Nov 14 08:24 hard_link.txt
-rw-rw-r-- 2 conan conan 7 Nov 14 08:24 readme.txt
lrwxrwxrwx 1 conan conan 10 Nov 14 13:11 soft_link.txt -> readme.txt
文件hard_link.txt是文件readme.txt硬连接文件,文件soft_link.txt是文件readme.txt软连接文件。
-
4.9 删除文件
# 有两个函数可以使用file.remove和unlink,其中unlink函数使用同删除目录操作是一样的。 # 删除文件 > file.remove("A.txt", "B.txt", "C.txt") [1] FALSE TRUE TRUE # 删除文件 > unlink("readme.txt") # 查看目录文件 > system("ls -l") total 12 -rwx------ 1 conan conan 70 Nov 14 12:55 AA.txt dr-xr-xr-x 2 conan conan 4096 Nov 14 08:36 create -rw-rw-r-- 1 conan conan 7 Nov 14 08:24 hard_link.txt lrwxrwxrwx 1 conan conan 10 Nov 14 13:11 soft_link.txt -> readme.txt # 打印硬连接文件 > readLines("hard_link.txt") [1] "file A" # 打印软连接文件,soft_link.txt,由于原文件被删除,有错误 > readLines("soft_link.txt") Error in file(con, "r") : cannot open the connection In addition: Warning message: In file(con, "r") : cannot open file 'soft_link.txt': No such file or directory
5. 几个特殊的目录
R.home() 查看R软件的相关目录
.Library 查看R核心包的目录
.Library.site 查看R核心包的目录和root用户安装包目录
.libPaths() 查看R所有包的存放目录
system.file() 查看指定包所在的目录
-
5.1 R.home() 查看R软件的相关目录
# 打印R软件安装目录 > R.home() [1] "/usr/lib/R" # 打印R软件bin的目录 > R.home(component="bin") [1] "/usr/lib/R/bin" # 打印R软件文件的目录 > R.home(component="doc") [1] "/usr/share/R/doc" 通过系统命令,找到R文件的位置。 # 检查系统中R文件的位置 ~ whereis R R: /usr/bin/R /etc/R /usr/lib/R /usr/bin/X11/R /usr/local/lib/R /usr/share/R /usr/share/man/man1/R.1.gz # 打印环境变量R_HOME ~ echo $R_HOME /usr/lib/R 通过R.home()函数,我们可以很容易的定位R软件的目录。
-
5.2 R软件的包目录
# 打印核心包的目录 > .Library [1] "/usr/lib/R/library" # 打印核心包的目录和root用户安装包目录 > .Library.site [1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library" [3] "/usr/lib/R/library" # 打印所有包的存放目录 > .libPaths() [1] "/home/conan/R/x86_64-pc-linux-gnu-library/3.0" [2] "/usr/local/lib/R/site-library" [3] "/usr/lib/R/site-library" [4] "/usr/lib/R/library"
-
5.3 查看指定包所在的目录
# base包的存放目录 > system.file() [1] "C:/PROGRA~1/R/R-32~1.0/library/base" # pryr包的存放目录 > system.file(package = "pryr") [1] "C:/Users/abdata/Documents/R/win-library/3.2/pryr"
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。