在shell or R 中判断一个文件是否为空。

1. shell 中判断文件是否存在或者是否为空文本

在lunix中写脚本时,总免不了判断文件是否存在,文件内容是否为空的等操作。而这些操作都可以用test指令来实现,可通过man test进行查看相关指令。

#! /bin/sh
if test -s file.txt;then
          echo "hi"
else
        echo "empty"
fi
### 另外一个等同的
#! /bin/sh
if  [ -s file.txt ];then
          echo "hi"
else
        echo "empty"
fi

-f判断是不是文件; -d判断是不是目录;-e判断文件/目录是否存在;-s判断文件长度是否不为0,当-s后面跟目录是,总是返回真

2. R语言文件操作

R语言的基础函数中也囊括了文件夹和文件的基本操作函数,由于使用R的过程中会常常需要与文件打交道,因此一些基本的文件操作函数在实际使用中是十分常见的,这里做了一些简单的整理。

2.1 构建文件路径:

file.path(..., fsep = .Platform$file.sep)

file.path用于构建文件路劲,默认会使用.Platform$file.sep作为文件分隔符,因此可以实现跨平台操作,该函数实际较为常用。

#按向量中元素对应的位置生成文件路劲
file.path(c('C:', 'D:'), c('R_script', 'R_data'))

2.2 列出路劲下的文件/目录 :

#列出当前目录下的文件和文件夹
list.files(path = ".", pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE, ignore.case = FALSE,include.dirs = FALSE, no.. = FALSE)
#列出当前目录下的文件和文件夹
dir(path = ".", pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE, ignore.case = FALSE,include.dirs = FALSE, no.. = FALSE)
#列出当前目录下的所有子目录,默认recursive = TRUE
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
  • path – 字符串表示的路劲全名,默认为当前工作路劲;
  • pattern – 查找的文件名,支持正则表达式;
  • all.files – 逻辑值,FALSE(默认)仅仅返回可见的文件名,TRUE返回文件全名;
  • full.names – 逻辑值,FALSE(默认)仅返回文件名,TRUE返回文件名包括路劲;
  • recursive – 逻辑值,FALSE(默认)仅返回当前目录下文件,TRUE递归的扫描所有目录下的文件;
  • ignore.case – 逻辑值,FALSE(默认)文件名大小写敏感,TRUE忽略大小写;
  • include.dirs -逻辑值,FALSE(默认)不添加子目录名,TRUE加入子目录名称;
  • no.. – 逻辑值,FALSE(默认)不排除‘.’和‘..’,TRUE为排除;

返回给定路劲下文件名或文件夹组成的字符向量,如果没有返回空字符。如果给定的路劲不存在,或为非法路劲或没有读取权限,返回空字符。list.dirs隐式的包含all.files = TRUE。

2.3 创建文件夹及设置权限

path.expand(path)
dir.create(path, showWarnings = TRUE, recursive = FALSE, mode = "0777")
dir.exists(paths)
Sys.chmod(paths, mode = "0777", use_umask = TRUE)
Sys.umask(mode = NA)
  • path – 字符串表示的路劲,路劲已经过path.expand处理

  • paths – 字符向量包含文件名或路劲, 路劲已经过path.expand处理

  • showWarnings – 逻辑值,是否提示错误信息;

  • recursive – 逻辑值,是否创建子目录

  • mode – 八进制表示的权限,r=4,w=2,x=1 (windows环境下该参数无效)

  • use_umask – 逻辑值,mode是否受umask 设置的限制;

#例子
#读取环境变量R_USER,返回C:/Users/XXXX/Documents
Sys.getenv('R_USER')
#使用home path替换波浪号,返回C:/Users/XXXX/Documents/foo
path.expand("~/foo")

#在当前工作目录下创建文件夹testfolder
dir.create(file.path(getwd(), 'testfolder'))
#默认的recursive为FALSE,创建子目录失败
dir.create(file.path(getwd(), 'testfolder2', 'subfolder'))
#文件夹不存在返回FALSE
dir.exists(file.path(getwd(), 'testfolder2', 'subfolder'))
#设置recursive为TRUE,创建子目录
dir.create(file.path(getwd(), 'testfolder2', 'subfolder'), recursive = TRUE)
#创建成功返回TRUE
dir.exists(file.path(getwd(), 'testfolder2', 'subfolder'))

#设置文件目录的最大权限
Sys.chmod(list.dirs("."), "777")

2.4 查询和设置R包使用路径

.libPaths(new)

不带参数时.libPaths()会显示当前使用的R包路劲,设置参数可用于设置当前R包路径,对于安装多版本R语言的情况,可以通过使用.libPaths设置使用的R包路劲。

#例子
#设置R包路劲为R-3.2.2下的library
.libPaths("C:/Users/XXXX/Documents/R/R-3.2.2/library")

2.5文件处理

file.create(..., showWarnings = TRUE)
file.exists(...)
#成功返回0,失败返回-1
file.access(names, mode = 0)
file.remove(...)
#删除文件及目录
unlink(x, recursive = FALSE, force = FALSE) 
file.rename(from, to)
file.append(file1, file2)
file.copy(from, to, overwrite = recursive, recursive = FALSE, copy.mode = TRUE, copy.date = FALSE)
file.show(..., header = rep("", nfiles),title = "R Information", delete.file = FALSE, pager = getOption("pager"), encoding = "")
file.symlink(from, to)
file.link(from, to)
Sys.junction(from, to)
  • from, to - 字符串向量表示的文件或路径
  • overwrite - 逻辑值,是否覆盖已存在的文件
  • showWarnings – 逻辑值,出错是否显示warning信息
  • recursive – 逻辑值,是否复制子目录文件
  • copy.mode - 逻辑值,是否同时复制文件权限
  • copy.date – 逻辑值,是否保留文件日期
  • mode – 接入模式,0,是否存在;1,是否可执行(windows没有可执行概念, 后缀为.exe, .bat, .cmd或.com的文件会被视为可执行文件);2,是否可写;4,是否可读;
#文件不存在则创建文件,存在则覆盖之前的文件
file.create('cretestfile.txt')
#判断文件是否存在,返回TRUE
file.exists('cretestfile.txt')
#默认mode = 0判断文件是否存在,存在返回0
file.access('cretestfile.txt')
#删除文件cretestfile.txt,文件不存在会返回warning信息
file.remove('cretestfile.txt')
#读取bin目录下所有文件及目录
d <- dir(file.path(R.home(), "bin"))
#读取bin目录下所有文件及目录(包含全路径)
df <- dir(file.path(R.home(), "bin"), full.names = TRUE)
#列出所有存在的文件
d[file.access(df, 0) == 0]
#列出所有可执行文件
d[file.access(df, 1) == 0]
#列出所有可写文件
d[file.access(df, 2) == 0]
#列出所有可读文件
d[file.access(df, 4) == 0]

#创建并写入数据到文件A.txt和B.txt
cat("file A\n", file = "A.txt")
cat("file B\n", file = "B.txt")
cat("file C\n", file = "C.txt")
#添加文件C.txt的内容到A.txt和B.txt
file.append(c("A.txt", "B.txt"), "C.txt")
#修改文件名C.txt为D.txt
file.rename("C.txt", "D.txt")
#复制D.txt中的内容10遍,添加到文件A.txt和B.txt各5次
file.append(c("A.txt", "B.txt"), rep("D.txt", 10))
#读取文件A.txt和B.txt的内容
file.show(c("A.txt", "B.txt"))
#复制文件D.txt到C.txt
file.copy("D.txt", "C.txt")
#C.txt已存在,设置overwrite = TRUE进行覆盖
file.copy("D.txt", "C.txt", overwrite = TRUE)
#新建tmp文件夹,并拷贝A.txt和B.txt到tmp文件夹下
dir.create("tmp")
file.copy(c("A.txt", "B.txt"), "tmp")
#删除tmp文件夹
unlink("tmp", recursive = TRUE)
#删除文件
unlink(c("A.txt", "B.txt", "C.txt","D.txt"))

文件信息查询
file.info(..., extra_cols = TRUE)
file.mode(...)
file.mtime(...)
file.size(...)

file.info返回文件相关信息:

  • size – doule类型,表示文件大小Bytes

  • isdir – 逻辑值,表示是否文件夹或者文件

  • mode – 8进制表示的权限,r=4,w=2,x=1

  • mtime – 最近一次修改的时间

  • ctime – 最近一个状态改变的时间,例如在写入文件、更改所有者、权限、属性或链接设置,mtime的改变必然导致ctime的改变

  • atime -读取文件或者执行文件时更改

  • exe – 可执行类型,返回值包含no,msdos, win16, win32, win64 和unknown

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