用R进行文件系统管理(转)

前言

R语言作为脚本语言,有一套文件系统管理的功能函数,也可以实现如Python一样的系统管理功能。

本文将详细介绍,R语言的文件系统管理。试试有什么不样吧?

目录

文件系统介绍

目录操作

文件操作

几个特殊的目录

1. 文件系统介绍

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

R语言和其他编程语言一样,都有对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中。

2. 目录操作

系统环境:

Linux: Ubuntu Server 12.04.2 LTS 64bit

R: 3.0.1 x86_64-pc-linux-gnu

2.1 查看目录

查看当前目录下的子目录。

# 启动R程序

~ R

# 当前的目录

> getwd()

[1] "/home/conan/R/fs"

# 查看当前目录的子目录

> list.dirs()

[1] "."    "./tmp"

查看当前目录的子目录和文件。

> dir()

[1] "readme.txt" "tmp"

# 查看指定目录的子目录和文件。

> dir(path="/home/conan/R")

[1] "A.txt"                            "caTools"

[3] "chinaWeather"                      "DemoRJava"

[5] "env"                              "FastRWeb"

[7] "font"                              "fs"

[9] "github"                            "lineprof"

[11] "pryr"                              "readme.txt"

[13] "RMySQL"                            "RServe"

[15] "rstudio-server-0.97.551-amd64.deb" "websockets"

[17] "x86_64-pc-linux-gnu-library"

# 只列出以字母R开头的子目录或文件

> dir(path="/home/conan/R",pattern='^R')

[1] "RMySQL" "RServe"

# 列出目录下所有的目录和文件,包括隐藏文件,如 .A.txt

> dir(path="/home/conan/R",all.files=TRUE)

[1] "."                                ".."

[3] ".A.txt"                            "A.txt"

[5] "caTools"                          "chinaWeather"

[7] "DemoRJava"                        "env"

[9] "FastRWeb"                          "font"

[11] "fs"                                "github"

[13] "lineprof"                          "pryr"

[15] "readme.txt"                        "RMySQL"

[17] "RServe"                            "rstudio-server-0.97.551-amd64.deb"

[19] "websockets"                        "x86_64-pc-linux-gnu-library"

查看当前目录的子目录和文件,同dir()函数。

> list.files()

[1] "readme.txt" "tmp"

> list.files(".",all.files=TRUE)

[1] "."          ".."        "readme.txt" "tmp"

查看完整的目录信息。

# 查看当前目录权限

> file.info(".")

size isdir mode              mtime              ctime              atime  uid  gid uname grname

. 4096  TRUE  775 2013-11-14 08:40:46 2013-11-14 08:40:46 2013-11-14 08:41:57 1000 1000 conan  conan

# 查看指定目录权限

> file.info("./tmp")

size isdir mode              mtime              ctime              atime  uid  gid uname grname

./tmp 4096  TRUE  775 2013-11-14 14:35:56 2013-11-14 14:35:56 2013-11-14 14:35:56 1000 1000 conan  conan

2.2 创建目录

# 在当前目录下,新建一个目录

> dir.create("create")

> list.dirs()

[1] "."        "./create" "./tmp"

创建一个3级子目录./a1/b2/c3

# 直接创建,出错

> dir.create(path="a1/b2/c3")

Warning message:

In dir.create(path = "a1/b2/c3") :

cannot create dir 'a1/b2/c3', reason 'No such file or directory'

# 递归创建,成功

> dir.create(path="a1/b2/c3",recursive = TRUE)

> list.dirs()

[1] "."          "./a1"      "./a1/b2"    "./a1/b2/c3" "./create"  "./tmp"

# 通过系统命令查看目录结构

> system("tree")

.

├── a1

│   └── b2

│      └── c3

├── create

├── readme.txt

└── tmp

2.3 检查目录是否存在

# 目录存在

> file.exists(".")

[1] TRUE

> file.exists("./a1/b2")

[1] TRUE

# 目录不存在

> file.exists("./aa")

[1] FALSE

2.4 检查目录的权限

检查目录的权限

> df<-dir(full.names = TRUE)

# 检查文件或目录是否存在,mode=0

> file.access(df, 0) == 0

./a1    ./create ./readme.txt        ./tmp

TRUE        TRUE        TRUE        TRUE

# 检查文件或目录是否可执行,mode=1,目录为可以执行

> file.access(df, 1) == 0

./a1    ./create ./readme.txt        ./tmp

TRUE        TRUE        FALSE        TRUE

# 检查文件或目录是否可写,mode=2

> file.access(df, 2) == 0

./a1    ./create ./readme.txt        ./tmp

TRUE        TRUE        TRUE        TRUE

# 检查文件或目录是否可读,mode=4

> file.access(df, 4) == 0

./a1    ./create ./readme.txt        ./tmp

TRUE        TRUE        TRUE        TRUE

修改目录权限。

# 修改目录权限,所有用户只读

> Sys.chmod("./create", mode = "0555", use_umask = TRUE)

# 查看目录完整信息,mode=555

>  file.info("./create")

size isdir mode              mtime              ctime              atime  uid  gid uname grname

./create 4096  TRUE  555 2013-11-14 08:36:28 2013-11-14 09:07:05 2013-11-14 08:36:39 1000 1000 conan  conan

# create目录不可以写

> file.access(df, 2) == 0

./a1    ./create ./readme.txt        ./tmp

TRUE        FALSE        TRUE        TRUE

2.5 对目录重名

# 对tmp目录重命名

> file.rename("tmp", "tmp2")

[1] TRUE

# 查看目录

> dir()

[1] "a1"        "create"    "readme.txt" "tmp2"

2.6 删除目录

# 删除tmp2目录

> unlink("tmp2", recursive = TRUE)

# 查看目录

> dir()

[1] "a1"        "create"    "readme.txt"

2.7 其他功能函数

拼接目录字符串

# 拼接目录字符串

> file.path("p1","p2","p3")

[1] "p1/p2/p3"

> dir(file.path("a1","b2"))

[1] "c3"

获取最底层的子目录名

# 当前目录

> getwd()

[1] "/home/conan/R/fs"

# 最底层子目录

> dirname("/home/conan/R/fs/readme.txt")

[1] "/home/conan/R/fs"

# 最底层子目录或文件名

> basename(getwd())

[1] "fs"

>  basename("/home/conan/R/fs/readme.txt")

[1] "readme.txt"

转换文件扩展路径

# 转换~为用户目录

> path.expand("~/foo")

[1] "/home/conan/foo"

标准化路径,用来转换win或linux的路径分隔符

# linux

> normalizePath(c(R.home(), tempdir()))

[1] "/usr/lib/R"      "/tmp/RtmpqNyjPD"

# win

> normalizePath(c(R.home(), tempdir()))

[1] "C:\\Program Files\\R\\R-3.0.1"

[2] "C:\\Users\\Administrator\\AppData\\Local\\Temp\\RtmpMtSnci"

短路径,缩减路径的显示长度,只在win中运行。

# win

> shortPathName(c(R.home(), tempdir()))

[1] "C:\\PROGRA~1\\R\\R-30~1.1"

[2] "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\RTMPMT~1"

3. 文件操作

3.1 查看文件

> dir()

[1]  "create"  "readme.txt"

# 检查文件是否存在

> file.exists("readme.txt")

[1] TRUE

# 文件不存在

> file.exists("readme.txt222")

[1] FALSE

# 查看文件完整信息

> file.info("readme.txt")

size isdir mode              mtime              ctime              atime  uid  gid uname grname

readme.txt    7 FALSE  664 2013-11-14 08:24:50 2013-11-14 08:24:50 2013-11-14 08:24:50 1000 1000 conan  conan

# 查看文件访问权限,存在

>  file.access("readme.txt",0)

readme.txt

0

# 不可执行

>  file.access("readme.txt",1)

readme.txt

-1

# 可写

>  file.access("readme.txt",2)

readme.txt

0

# 可读

>  file.access("readme.txt",4)

readme.txt

0

# 查看一个不存在的文件访问权限,不存在

> file.access("readme.txt222")

readme.txt222

-1

判断是文件还是目录。

# 判断是否是目录

> file_test("-d", "readme.txt")

[1] FALSE

> file_test("-d", "create")

[1] TRUE

# 判断是否是文件

> file_test("-f", "readme.txt")

[1] TRUE

> file_test("-f", "create")

[1] FALSE

3.2 创建文件

# 创建一个空文件 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"

把文件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"

把文件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"

3.3 修改文件权限

# 修改文件权限,创建者可读可写可执行,其他人无权限

> 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

3.4 文件重命名

# 给文件A.txt重命名为AA.txt

> file.rename("A.txt","AA.txt")

[1] TRUE

> dir()

[1] "AA.txt"    "B.txt"      "create"    "C.txt"      "readme.txt"

3.5 硬连接和软连接

硬连接,指通过索引节点来进行连接。在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软连接文件,

3.5 删除文件

有两个函数可以使用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

4. 几个特殊的目录

R.home() 查看R软件的相关目录

.Library 查看R核心包的目录

.Library.site 查看R核心包的目录和root用户安装包目录

.libPaths() 查看R所有包的存放目录

system.file() 查看指定包所在的目录

4.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软件的目录。

4.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"

4.3 查看指定包所在的目录

# base包的存放目录

> system.file()

[1] "/usr/lib/R/library/base"

# pryr包的存放目录

>  system.file(package = "pryr")

[1] "/home/conan/R/x86_64-pc-linux-gnu-library/3.0/pryr"

其实,用R语言操作文件系统还是很方便的。但对于函数命名确实不太规范,需要我们花时间记忆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • GIT分布式版本控制系统最佳实践 这篇文章来自于老男孩教育高级架构师班12期的徐亮偉同学。 首先感谢老男孩架构师班...
    meng_philip123阅读 3,400评论 4 36
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,367评论 0 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 深度学习 【20150628群沙龙完整版】斯坦福、谷歌、百度、阿里人工智能顶级专家,探讨未来5年产业机会 网页链接...
    hzyido阅读 465评论 0 1