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