linux 中一切皆文件,我們所做的一切都是和文件打交道,總結下常用的文件管理相關命令
文件分為兩部分:元數據和數據元數據: 即真實數據的屬性。可用 stat 命令查看
stat [option]... FILE...[root@black ~]# stat /etc/passwd
File: ‘/etc/passwd’
Size: 2302 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 10244448 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2016-06-18 19:52:01.243237019 -0400
Modify: 2016-04-23 09:47:20.643714195 -0400
Change: 2016-04-23 09:47:20.650714195 -0400
Birth: -
包括文件大小,所占的塊數 ,所占塊大小, 文件類型, 權限, 所屬屬主,屬組,context值
文件訪問時間,文件內容修改時間,文件改變的時間。
其中access,modify, change 為文件的時間戳,可以用touch 命令來修改touch -a FILE 只是修改文件的atime
touch -m FILE 只是修改文件的mtime
注: 當atime或mtime 其中之一任意改變,ctime都會改變。
touch 命令同時還可以創建文件用法:touch FILE
如果名字後面想跟上創建文件時的時間,可以引用date命令來實現。
e.g. 在/tmp目錄下創建已tfile開頭,後面接當前日期的文件,格式如tfile-2015-5-27-09-22-33
touch tfile-$(date +%F-%H-%M-%S)
當我們每次需要創建該類型的文件時,都得輸入這麼長的命令,為了方便,我們可以把上面那條命令定義一個別名,以後可以直接輸入別名就可以達到該效果。 定義命令別名 tfile 當前shell生效 :alias tfile=‘touch tfile-$(date +%F-%H-%M-%S)’ 如果對所有用戶生效,可以編輯/etc/bashrc ,在最後一行加上如上命令。
當我們管理文件時,首先要知道自己所處的位置,然後開始工作
pwd : 顯示當前的在哪個目錄下,默認登錄進系統,都處於登錄用戶的家目錄下。mkdir: 創建目錄,目錄也是文件。
用法 mkdir [option]... FILE...rmdir: 只能刪除空目錄。一般刪除目錄和文件用rm命令。
列子:
1. 創建/tmp目錄下的:a_c, a_d, b_c, b_d
解:touch /tmp/{a,b}_{c,d}
2. 創建/tmp/mylinux目錄下的各級目錄:
mylinux/ ├── bin ├── boot │ └── grub ├── dev ├── etc │ ├── rc.d │ │ └── init.d │ └── sysconfig │ └── network-scripts ├── lib │ └── modules ├── lib64 ├── proc ├── sbin ├── sys ├── tmp ├── usr │ └── local │ ├── bin │ └── sbin └── var ├── lock ├── log └── run
解: mkdir -p /tmp/mylinux/{bin,boot/grub/,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
當我們執行完命令後,我們可以查看命令執行狀態返回值來查看命令是否成功。echo $?
當值是0時,表示命令執行成功,
當值是1-255時,表示命令執行失敗。
通配符與正則表達式當我們需要查看目錄中某些特定需求的文件時,此時就需要通過glob(通配符)或者正則表達式的幫助來完成。
我們可以通過幾個列子來總結下。
例子:
1、顯示/var目錄下所有以1開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
解: ls -R /var | grep "^1.*[0-9].*[a-z]$"
2、顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
解: ls -R /etc | grep "^[[:digit:]].*[^[:digit:]]$"
3、顯示/etc目錄下,以非字母開頭,後面跟了一個字母以及其它任意長度任意字符的文件或目錄。
解: ls -R /etc/ | grep "^[^[:alpha:]][[:alpha:]].*" | grep -v "^\ /.*"
一般來說,如果是在一個目錄下面查找特定需求的文件,只要用到通配符就好,但是上面題目中所要求要查找出所有的文件和目錄,這裡只能是用到正則表達式了,也許是有別的方法,以後再研究,這裡總結下通配符和正則表達式。
通配符:即shell中為了實現文件名的匹配,查找類似的文件,即打牌中的賴子。
* : 匹配任意長度的任意字符。
? : 匹配任意一個字符。
[] : 匹配指定范圍的一個字符。
[^] : 匹配范圍外的字符。
專用的字符合集:
[:alnum:] : 數字或字母
[:alpha:] : 字母
[:digit:] : 數字
[:lower:] : 小寫字母
[:graph:] : 除了空格和控制字符外的所有字符
[:punct:] : 標點符號
[:upper:] : 大寫字母
正則表達式主要是對文本的匹配,像上面的幾道題都是先顯示出來目錄下的所有文件,相當於把結果放到了一個文本中,再通過正則表達式來匹配結果。
字符匹配: . 表示任意單個字符 ; [] [^] 字符合集與通配符一樣。次數匹配:
* 匹配前面的字符任意次數 .* 表示任意長度的任意字符\? 匹配前面字符0次或1次
\+ 匹配前面字符至少1次
\{m\} 匹配前面字符m次
\{m,n\} 匹配前面字符至少m次,至多n次。
位置匹配:
^ :表示以什麼開頭
$ : 表示以什麼結尾
\< :匹配單詞詞首
\> : 匹配單詞詞尾。
文件的復制移動刪除cp 復制文件和文件夾
語法 : cp [option]... SOURCE DEST (復制單個源到目標)cp [option]... SOURCE... DEST (復制多個源到目標)
注: ... 表示可以存在多個例子:
1. 復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。
解:此時就需要通過通配符來完成該操作了。
mkdir /tmp/mytest{1,2,3}
cp -r /etc/p*[^[:digit:]] /tmp/mytest1
2 . 復制/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
解: cp -r /etc/*.d /tmp/mytest2
3. 復制/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。
解: cp -r /etc/[l,m,n]*.conf /tmp/mytest3
cp的常用選項:-r ,-R: 遞歸復制,復制目錄下所有目錄和文件
-i : 交互式
-a : 歸檔,保留元數據屬性,相當於-dR -preserv=all
-d : 不復制真實的文件,還是保持該文件為鏈接文件
-L : 復制文件真實內容,文件不存為鏈接文件
-p : 保留 屬主,屬組,時間戳
mv 移動文件夾(用於改文件名)語法 : mv [option]... SOURCE DEST (移動單個源到目標)
mv [option]... SOURCE... DEST (移動多個源到目標)rm 刪除文件或文件夾
語法: rm [option]... FILE...