前言
R語言作為腳本語言,有一套文件系統管理的功能函數,和其他編程語言一樣,都能對文件系統進行操作,包括文件操作和目錄操作,相關函數都定義在base包中。
目錄
-
1.文件系統介紹
-
2.文件系統操作函數概覽
-
3.目錄操作
-
4.文件操作
-
5.幾個特殊的目錄
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:\\PROGRA~1\\R\\R-32~1.0" [2] "C:\\Users\\abdata\\AppData\\Local\\Temp\\RTMP8S~1"
4. 文件操作
-
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
5. 幾個特殊的目錄
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:/PROGRA~1/R/R-32~1.0/library/base" # pryr包的存放目錄 > system.file(package = "pryr") [1] "C:/Users/abdata/Documents/R/win-library/3.2/pryr"