R语言-文件管理系统操作 list.files dir.file dir

前言
  R语言作为脚本语言,有一套文件系统管理的功能函数,和其他编程语言一样,都能对文件系统进行操作,包括文件操作和目录操作,相关函数都定义在base包中。

目录
1.文件系统介绍

2.文件系统操作函数概览

3.目录操作

4.文件操作

5.几个特殊的目录

Directory functions

|

fs base shell
dir_ls("path") list.files("path") ls path
dir_info("path") do.call(rbind, lapply(list.files("path"), file.info)) ls -al path
dir_copy("path", "new-path") dir.create("new-path"); file.copy("path", "new-path", recursive=TRUE) cp path new-path
dir_create("path") dir.create("path") mkdir path
dir_delete("path") unlink("path", recursive = TRUE) rm -rf path
dir_exists("path") dir.exists("path") if [ -d "path" ]; then ... ; fi
dir_move() (see file_move) file.rename("path", "new-path") mv path new-path
dir_map("path", fun) No direct equivalent for file in $(ls path); do ...; done
dir_tree("path") No direct equivalent tree path

File functions

fs base shell
file_chmod("path", "mode") Sys.chmod("path", "mode") chmod mode path
file_chown("path", "user_id", "group_id") No direct equivalent chown options path
file_copy("path", "new-path") file.copy("path", "new-path") cp path new-path
file_create("new-path") file.create("new-path") touch new-path
file_delete("path") unlink("path") rm path
file_exists("path") file.exists("path") if [ -f "path" ]; then ... ; fi
file_info("path") file.info("path") ls -al path
file_move("path", "new-path") file.rename("path", "new-path") mv path new-path
file_show("path") browseURL("path") open path
file_touch() No direct equivalent touch path
file_temp() tempfile() mktemp
file_test() No direct equivalent if [ -d "path" ]; then ...; fi

Path functions

fs base shell
path("top_dir", "nested_dir", "file", ext = "ext") file.path("top_dir", "nested_dir", "file.ext") top_dir/nested_dir/file.ext
path_temp(), path_temp("path") tempdir(), file.path(tempdir(), "path") mktemp -d
path_expand("~/path") path.expand() realpath -m -s ~/path
path_dir("path") dirname("path") dirname path
path_file("path") basename("path") basename path
path_home() path.expand("~") $HOME
path_package("pkgname", "dir", "file") system.file("dir", "file", package = "pkgname") No direct equivalent
path_norm("path") normalizePath() realpath
path_real("path") normalizePath(mustWork = TRUE) realpath
path_rel("path/foo", "path/bar") No direct equivalent No direct equivalent
path_common(c("path/foo", "path/bar", "path/baz")) No direct equivalent No direct equivalent
path_ext_remove("path") sub("\\.[a-zA-Z0-9]*$", "", "path") No direct equivalent
path_ext_set("path", "new_ext") sub("\\.[a-zA-Z0-9]*$", "new_ext", "path") No direct equivalent
path_sanitize("path") No direct equivalent No direct equivalent
  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:\PROGRA1\R\R-321.0”
[2] “C:\Users\abdata\AppData\Local\Temp\RTMP8S~1”

  1. 文件操作
    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

  1. 几个特殊的目录
    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:/PROGRA1/R/R-321.0/library/base”

pryr包的存放目录

system.file(package = “pryr”)
[1] “C:/Users/abdata/Documents/R/win-library/3.2/pryr”

©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。

邮箱:wanglei@hrbcu.edu.cn 关于我们

上一篇:linux - share files between the linux and windows


下一篇:如何将Python代码打包为可执行文件