在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閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374