一、linux中的文件,及文件操作管理命令
1. 文件概念
存儲空間存儲的一段流式數據,對數據可以做到按名存取。
-
linux中的文件具有的特點是:可通過操作系統或者程序對外提供信息,也能對內輸入信息,可以被創建,刪除。linux中,文件有特別重要的意義,他們為操作系統和設備提供了一個簡單而統一的接口。在linux中,幾乎一切都可以看做是文件 。這就意味著,普通程序完全可以像使用文件(普通定義)那樣使用磁盤文件、串行口、打印機和其他設備。
例如:可以把cdrom驅動器掛載為一個文件
~]# mount /dev/cdrom /media/cdrom/ 掛載光盤文件 ~]# cd /media/cdrom/ [root@localhost cdrom]# ls CentOS_BuildTag isolinux RPM-GPG-KEY-CentOS-Debug-6 EFI Packages RPM-GPG-KEY-CentOS-Security-6 EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6 GPL repodata TRANS.TBL images RPM-GPG-KEY-CentOS-6
注:上面這個例子證明硬件設備在linux中也被表示為文件
2、對文件的操作
-
操作一般意義上的文件一樣,linux中對文件的操作只需要五個基本的函數:open(), read(), write(), close(), delete(), create();通過調用這幾個函數就能對linux中的文件進行讀、寫等操作。不過,這種操作又分為系統調用和庫函數調用。簡單的說,系統調用是最直接的方式,庫函數調用最終也是通過系統調用實現的??烧J為庫函數調用是對系統調出于效率考慮而做出的優化;我們用很少的函數就可以對文件和設備進行訪問和控制。這些函數就是所謂的系統調用,由操作系統直接提供,他們是通向操作系統本身的接口。
操作系統的核心部分,既內核,其實就是一組設備驅動程序。這是一些對硬件進行控制的接口。
3、文件操作相關命令
-
cat命令 文件文本查看工具;
cat:concatenate files and print on the standard output 連接文件并在標準輸出上打印 ~]# cat /etc/fstab ..... cat [OPTION]... [FILE]... -n:給顯示的文本行編號; -E: 顯示行結束符$; ~]# cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ~]# cat -E /etc/issue CentOS release 6.6 (Final)$ Kernel \r on an \m$ $
-
tac命令 文件文本查看工具;逆序顯示
tac [OPTION]... [FILE]... -n:給顯示的文本行編號; -E: 顯示行結束符$;
-
head命令 查看文件的前n行;默認10行
head [options] FILE -n # 可以-3,也可 -n 3 默認不加選項 顯示10行 -# ~]# head -n 3 /etc/fstab # # /etc/fstab
-
tail命令 查看文件的后n行;默認10行
tail [options] FILE -n # -# -f:查看文件尾部內容結束后不退出,跟隨顯示新增的行; ~]# tail -1 /etc/fstab proc /proc proc defaults 0 0 ~]# echo "second line" >> /tmp/functions ~]# tail -f /tmp/functions fi fi fi done < /etc/crypttab return $ret } # A sed expression to filter out the files that is_ignored_file recognizes __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d' new line second line 注意:-f 選項 后期監控日志增長的時候非常有用;
4.文件管理類命令
-
cp命令
源文件;目標文件; 單源復制:cp [OPTION]... [-T] SOURCE DEST 多源復制:cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... 單源復制:cp [OPTION]... [-T] SOURCE DEST 如果DEST不存在:則事先創建此文件,并復制源文件的數據流至DEST中; 如果DEST存在: 如果DEST是非目錄文件:則覆蓋目標文件; 如果DEST是目錄文件:則先在DEST目錄下創建一個與源文件同名的文件,并復制其數據流; 多源復制:cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... 如果DEST不存在:錯誤;目標必須是目錄; 如果DEST存在: 如果DEST是非目錄文件:錯誤; 如果DEST是目錄文件:分別復制每個文件至目標目錄中,并保持原名; -i:交互式復制,即覆蓋之前提醒用戶確認; -f:強制覆蓋目標文件;如果目標文件不能被打開,則移除并覆蓋之 -r, -R:遞歸復制目錄;遞歸復制目錄及目錄中的內容; -d:復制符號鏈接文件本身,而非其指向的源文件; -a:-dR --preserve=all, archive,用于實現歸檔;理解為做備份 --preserv= mode:權限 ownership:屬主和屬組 timestamps: 時間戳 context:安全標簽 xattr:擴展屬性 links:符號鏈接 all:上述所有屬性 -i 選項: ~]# alias alias cp='cp -i' 管理員root系統自動給定義了別名,而普通用戶沒有; ~]# cp /etc/fstab /tmp/ cp: overwrite `/tmp/fstab'? 交互式確認 -r,-R選項: ~]# cp -r /var/log /tmp/ 目標目錄存在會在其下創建一個與原目錄同名的目錄到該目錄下且該目錄內容全部復制過去; ~]# ls /tmp/ fstab functions hello log moosefs mytest passwd.out skel -d選項: ~]# cp /etc/system-release /tmp/ 把這個符號鏈接指向的源文件真實數據給復制了 ~]# ls /tmp/ fstab functions hello skel system-release ~]# cat /tmp/system-release CentOS release 6.6 (Final) 不想讓他把數據給復制過去,就使用-d選項; ~]# cp -d /etc/system-release /tmp/system.rel ~]# ls -l /tmp/ lrwxrwxrwx 1 root root 14 Dec 8 00:53 system.rel -> centos-release -rw-r--r-- 1 root root 27 Dec 8 00:49 system-release
-
mv命令 move
move (rename) files 移動或者重命名 源有多個,目標只能為目錄 mv [OPTION]... [-T] SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE.. -i :交互式覆蓋 -f : 強制覆蓋 tmp]# mv hello hello.txt 源文件與目標文件在同一個目錄下,就改名 tmp]# ls fstab hello.txt moosefs passwd.out system.rel functions log mytest skel system-release tmp]# mv x tom 無需選項 tmp]# ll drwxr-xr-x 2 root root 4096 Dec 8 01:02 tom
-
rm命令remove
rm [OPTION]... FILE... 常用選項: -i:interactive 交互式 -f:force 強制 -r: recursive 遞歸 刪除目錄:rm -rf /PATH/TO/DIR 危險操作:rm -rf /* 紅帽系統是ext系列的文件系統,反刪除能力非常薄弱; 注意:所有不用的文件建議不要直接刪除,而是移動至某個專用目錄;(模擬回收站) 對于管理員來說,定義了別名,而普通用戶沒有; tmp]# rm hello.txt rm: remove regular empty file `hello.txt'? y,刪除,n,或者不跟任何字符都不刪除; tmp]# rm -r /tmp/log/ rm: descend into directory `/tmp/log'? y rm: remove regular file `/tmp/log/dmesg.old'? y rm: descend into directory `/tmp/log/sa' 當然使用# rm -fr /tmp/log
二、bash的工作特性之命令執行狀態返回值和命令行展開
-
命令執行狀態返回值
bash中一條命令的執行,會產生兩種返回結果:命令結果及命令執行狀態結果。一條命令成功執行,其執行狀態返回值為0。如果未能成功執行,其返回值為1-255。 ~]# ls anaconda-ks.cfg A-Z install.log tee test.txt tree a-z fstab install.log.syslog test tr [root@localhost ~]# echo $? 0 ~]# llls -bash: llls: command not found [root@localhost ~]# echo $? 127
-
命令行展開
~:自動展開為用戶的家目錄,或指定的用戶的家目錄; ~]# cd ~ 進入當前登錄賬號的家目錄, 默認 "cd" 命令就可以實現 ~]# cd ~loginname 進入指定用于的家目錄 {}:可承載一個以逗號分隔的路徑列表,并能夠將其展開為多個路徑; 例如:/tmp/{a,b} 相當于 /tmp/a /tmp/b 問題1:如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b? ~]# mkdir -pv /tmp/x/{y1/{a,b},y2} 問題2:如何創建a_c, a_d, b_c, b_d; ~]# mkdir -v {a,b}_{c,d} 問題3:創建如下目錄結構: /tmp/mysysroot/ |-- bin |-- etc | `-- sysconfig | `-- network-scripts |-- sbin |-- usr | |-- bin | |-- lib | |-- lib64 | |-- local | | |-- bin | | |-- etc | | |-- lib | | `-- sbin | `-- sbin `-- var |-- cache |-- log `-- run ~]# mkdir -pv /tmp/mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
三、文件的元數據狀態查看,修改時間戳等操作
-
文件:每一個文件都有兩類數據
元數據:metadata 快速檢索內容的目錄。理解為描述數據的屬性 包括:大小,塊數,類型,設備號;inode 號(索引節點號), 鏈接次數,硬鏈接;創建時間 數據: data 正文部分 數據一改變,元數據就會立即更新他的時間戳,意味著改動時間也立即跟新
-
stat命令 顯示文件的狀態
stat - display file or file system status 顯示文件的狀態 stat FILE... ~]# stat /tmp/functions File: '/tmp/functions' Size: 13966 Blocks: 32 IO Block: 4096 regular file Device: 803h/2051d Inode: 201326722 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:user_tmp_t:s0 時間戳: 最近訪問:Access: 2016-11-14 14:19:50.622408377 +0800 讀取文件內容;數據流 最近更改:Modify: 2016-11-14 14:18:14.173408906 +0800 新增一行,數據改變 最近改動:Change: 2016-11-14 14:18:14.173408906 +0800 元數據改變
-
touch命令:修改文件時間戳
change file timestamps 更改文件時間戳 -c:指定的文件路徑不存在時后,不予創建; -a: 僅修改access time; 直接修改當下命令執行時的時間; -m:僅修改modify time; 注意:change time 不能手動指定更改 -t STAMP (指定要改為哪一刻時間) [[CC]YY]MMDDhhmm[.ss] 年月日 小時 分鐘 秒 ~]# touch /tmp/functions 如果不跟指定時間,該文件立即跟新為當下系統時間,命令執行的時間 ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2016-12-07 23:42:06.003985658 +0800 Change: 2016-12-07 23:57:47.679988222 +0800 ~]# touch /tmp/hello 摸一個不存在的文件,就會創建一個文件 ~]# ls /tmp/ functions hello ~]# file /tmp/hello 看到這個是個空文件 /tmp/hello: empty ~]# touch -c /tmp/lessssss 不存在該路徑不予創建 ~]# ls /tmp functions moosefs ~]# touch -m -t 0212010303.03 /tmp/functions ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2002-12-01 03:03:03.000000000 +0800 Change: 2016-12-08 00:13:13.438986294 +0800 數據一改變,元數據就會立即更新他的時間戳,意味著改動時間也立即跟新
四、別名的作用,以及如何在命令中引用其它命令的執行結果
-
alias命令用來設置指令的別名。我們可以使用該命令可以將一些較長的命令進行簡化。使用alias時,用戶必須使用單引號''將原來的命令引起來,防止特殊字符導致錯誤。
-
alias命令的作用只局限于該次登入的操作。若要每次登入都能夠使用這些命令別名,則可將相應的alias命令存放到bash的初始化文件/etc/bashrc或者/home/.bashrc(/root/.bashrc)中。
change file timestamps 更改文件時間戳 -c:指定的文件路徑不存在時后,不予創建; -a: 僅修改access time; 直接修改當下命令執行時的時間; -m:僅修改modify time; 注意:change time 不能手動指定更改 -t STAMP (指定要改為哪一刻時間) [[CC]YY]MMDDhhmm[.ss] 年月日 小時 分鐘 秒 ~]# touch /tmp/functions 如果不跟指定時間,該文件立即跟新為當下系統時間,命令執行的時間 ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2016-12-07 23:42:06.003985658 +0800 Change: 2016-12-07 23:57:47.679988222 +0800 ~]# touch /tmp/hello 摸一個不存在的文件,就會創建一個文件 ~]# ls /tmp/ functions hello ~]# file /tmp/hello 看到這個是個空文件 /tmp/hello: empty ~]# touch -c /tmp/lessssss 不存在該路徑不予創建 ~]# ls /tmp functions moosefs ~]# touch -m -t 0212010303.03 /tmp/functions ~]# stat /tmp/functions File: `/tmp/functions' Size: 19316 Blocks: 40 IO Block: 4096 regular file Device: 803h/2051d Inode: 272424 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-07 23:57:47.679988222 +0800 Modify: 2002-12-01 03:03:03.000000000 +0800 Change: 2016-12-08 00:13:13.438986294 +0800 數據一改變,元數據就會立即更新他的時間戳,意味著改動時間也立即跟新
-
引用命令的執行結果:命令引用是引用命令的執行結果,狀態結果靠$?
$(COMMAND) 或`COMMAND` ~]# date +%H-%M-%S 09-18-13 ~]# mkdir $(date +%H-%M-%S) 把$后的內容當做參數來引用; ~]# ls 09-19-39 a-z fstab bash的基于特性:引用 強引用:'' 內部任何字串直接顯示,不做替換 弱引用:"" 會替換,變量中所存儲的值; ~]# A=1 ~]# echo $A 1 ~]# echo '$A' $A ~]# echo "$A" 1 命令引用:``
五、其它練習題目
1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄; ~]# ls -d /var/l?[[:lower:]] /var/lib /var/log 2、顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄; ~]# ls -d /etc/[0-9]*[^0-9] 3、顯示/etc目錄下,以非字母開頭,后面跟一個字母及其它任意長度任意字符的文件或目錄; ~]# ls -d /etc/[^a-z][a-z]* 4、在/tmp目錄下創建以tfile開頭,后跟當前日期和時間的文件,文件名型如:tfile-2016-05-27-09-32-22. ~]# touch /tmp/tfile-$(date +%F-%H-%M-%S) ~]# ls /tmp/ fstab hello.txt moosefs passwd.out system.rel tfile-2016-12-08-10-24-52 5、復制/etc目錄下所有已p開頭,以非數字結尾的文件或目錄至/tmp/mytest1目錄; ~]cp -r /etc/p*[^0-9] /tmp/mytest1/ ~]# cp -r /etc/p*[^0-9] /tmp/mytest1 cp: overwrite `/tmp/mytest1/passwd'? y cp: overwrite `/tmp/mytest1/passwd-'? y ~]# ls /tmp/mytest1 pam.d pinforc 6、復制/etc/目錄下所有以.d結尾的文件或目錄至/tmp/mytest2中。 ~]# cp -r /etc/*.d /tmp/mytest2 ~]# ls /tmp/mytest2 bash_completion.d init.d modprobe.d rc1.d rc.d xinetd.d chkconfig.d latrace.d pam.d rc2.d rsyslog.d yum.repos.d cron.d ld.so.conf.d popt.d rc3.d rwtab.d 7、復制/etc目錄下所有已l或m或n開頭,已.cont結尾的文件至/tmp/mytest3目錄中。 ~]# cp -r /etc/[lmn]*.conf /tmp/mytest3 ~]# ls /tmp/mytest3 latrace.conf libaudit.conf logrotate.conf mke2fs.conf nsswitch.conf ld.so.conf libuser.conf ltrace.conf mtools.conf ntp.conf
原創文章,作者:讓優秀稱為一種習慣,如若轉載,請注明出處:http://www.www58058.com/63257
贊,總結的不錯~加油~