1、文件系統分層結構: LBS Linux Standard Base
/boot:引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader,grub)都存放于此目錄
/bin:供所有用戶使用的基本命令;不能關聯至獨立分區, OS啟動即會用到的程序
/sbin:管理類的基本命令;不能關聯至獨立分區, OS啟動即會用到的程序
/lib:啟動時程序依賴的基本共享庫文件以及內核模塊文件(/lib/modules)
/lib64:專用于x86_64系統上的輔助共享庫文件存放位置
/etc:配置文件目錄
/home/USERNAME:普通用戶家目錄
/root:管理員的家目錄
/media:便攜式移動設備掛載點
注意:
文件名稱區分大小寫
以.開頭的文件為隱藏文件
字符設備是順序訪問的,塊設備是隨機訪問的
dev/zero 是字符設備 c
sda 是塊設備 b block
塊設備有緩存,字符設備沒有緩存
設置文件設備顏色 /etc/DIR_COLORS
bin實際是個軟連接 快捷方式
所以 ll /bin/? ? ?ll /bin? ? ? 有區別 因為bin目錄是個軟鏈接
2、ls命令、wc命令、時間戳、stat命令、通配符glob
ls命令
ls -a 包含隱藏文件
ls -l 就是ll 顯示額外的信息
ls -R 目錄遞歸情況
ls -1 文件分行顯示
ls -S 按大到小排序
ls /data -lt 按照數據修改時間排序從新到舊(mtime)
ls /data -ltu 按照訪問時間排序從新到舊(atime)
ls /data -ltc 按照元數據修改時間排序從新到舊(ctime)
ls -U /data 按照排放次序排序,即創建次序 舊的文件排在前面 新的排后
ls -X 按文件后綴排序
ls -r 倒序排列文件
ls -d 只在本目錄不進入文件夾
ls -d */ 只顯示當前目錄文件夾
ls -i 查看文件inode 節點編號
例如在/data下有/dir1和/dir2兩個目錄
那么只顯示目錄的方法是:
ls -d /data/*/
ls -d .* 顯示當前目錄下的隱藏文件以及文件夾
ls -R 遞歸目錄
ls -R .* 顯示當前目錄和子目錄的包含../父目錄文件
ls -R .[^.]* 顯示遞歸隱藏文件
ls -Rd .[^.]* 顯示本目錄而不進入子目錄遞歸的隱藏文件
ls -ad .[^.]* 不顯示.和.的顯示本目錄的隱藏文件
wc命令
統計指定文件中的字節數、字數、行數,并將統計結果顯示輸出。
-c 統計字節數。
-l 統計行數。
-m 統計字符數。這個標志不能與 -c 標志一起使用。
stat命令
查看單個文件3個時間
文件數據分為:metadata(元數據), data
三個時間戳:
access time:訪問時間,atime,讀取文件內容
modify time: 修改時間, mtime,改變文件內容(數據)
change time: 改變時間, ctime,元數據發生改變
文件名優先級排列順序 數字 小寫字母 大寫字母
atime 讀取時間(access time) ctime 元數據修改時間 meta data 例如 擁有者名字。。。
不修改數據則會變化讀時間
ll –time=atime /data/1? ? ? ? ? 查看/data/1的讀時間
ll –time-ctime /data/1? ? ? ? ? ?查看/data/1元數據(狀態)修改時間
stat /data/file6? ? ? ? ? ? ? ? ? ? ? ? ?看file6的所有時間
glob 通配符
ls /etc/*.conf
* 一個或多個字符
? 一個字符
注:漢字是2個字節一個字符
ls ~-/data 列出上一個進入目錄下的/data
ls file[1..20] 表示 1 或者2 或者.或者0 4個文件
ls file[1-20] 表示1到20
ls file{1..20} 表示1到20
touch {A..D} 則創建 A B C D四個文件
touch f[A-D] 則創建f[A-D]這一個文件
ls f[a-d]則列出 fa fA fb fB fc fC fd 不會列出fD
ls f[A-D]則列出 fA fb fB fc fC fd fD 不會列出fa
如果有a b c abc四個文件ls /data/[abc] 會顯示a,b,c這三個文件但不會顯示abc這個文件
如果有a b c d 四個文件 ls /data/[^abc] 則會顯示d 就是排除的意思
[]代表選擇中間的任意一個字符而不是全部字符
[:digit:] 任意數字0-9
[:lower:] 任意小寫字母
[:upper:] 任意大寫字母
[:alpha:]任意大小寫字母
[:alnum:]任意數字或字母
ls f[[:upper:]] 列出所有包含單個大寫字母的文件
幫助文件 man 7 glob
練習
1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄
2、顯示/etc目錄下以任意一位數字開頭,且以非數字結尾的文件或目錄
3、顯示/etc/目錄下以非字母開頭,后面跟了一個字母及其它任意長度任意字符的文件或目錄
4、顯示/etc/目錄下所有以rc開頭,并后面是0-6之間的數字,其它為任意字符的文件或目錄
5、顯示/etc目錄下,所有以.d結尾的文件或目錄
6、顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的文件或目錄
7、只顯示/root下的隱藏文件和目錄
8、只顯示/etc下的非隱藏目錄
練習答案
1. ls /var/l*[[:digit:]]*[[:lower:]]
2. ls /etc/[[:digit:]]*[^[:digit:]]
3. ls /etc/[^[:alpha:]][[:alpha:]]*
4. ls -d /etc/rc[0-6]*
5. ls -d /etc/*.d
6. ls -d /etc/[mnrp]*.conf
7. ls -d /root/.*
8. ls -d /etc/[^.]*/
3、touch、cp、mv
touch命令
生成文件名為前一天時間的日志文件:
touch `date -d “-1 day” +%F`.log
注:
/etc/motd 是設置用戶登陸后的提示信息
/etc/issue 是設置用戶登陸前的提示信息
例:如果本來已經存在/etc/motd
touch /etc/motd
則不會改變文件,但是會刷新文件的3個時間
如果使用> /etc/motd 則會改變原文件變成空文件而且改變mtime和ctime(利用此特性可以刪除大文件)
例如創建大文件bigfile
dd if=/dev/zero of=/data/bigfile bs=1M count=1024
有一個bigfile大文件,則刪除大文件,釋放磁盤空間安全的方法為:
> bigfile
rm -f bigfile
原理就是利用> bigfile 創建同名文件會覆蓋原大文件變成一個小文件,然后刪除
touch -a 僅改變atime和ctime
touch -m 僅改變mtime和ctime
touch -t 指定atime和mtime的時間戳
touch -t 201910200830.50 /etc/hosts
touch -c 如果文件不存在則不予創建
cp命令
cp -r 才能復制目錄
cp -d 保留原始鏈接屬性,例如原文件是軟鏈接 則復制后還是原軟鏈接
cp -p 默認保留模式 擁有者 時間戳等如果可能還保留上下文 鏈接還有額外信息等沒有-r功能
cp -a /etc/ /data/etcbackup 保留屬性的備份 -a保留所有屬性(最全)
復制/dev/sda /dev/zero 之類的必須用cp -a 才能成功因為能保留所有屬性
cp -u 只復制源比目標更新的文件
cp -av /usr /data/ v可以看到過程一般復制大文件用,可以看到過程防止死機
cp –backup=numbered f1 /data/f1 復制同時建立原文件的備份,生產環境中建議加入原cp別名
alias cp=’cp -i –backup=numbered’ 寫入 .bashrc內
1、定義別名命令baketc,每天將/etc/目錄下所有文件,備份到/app獨立的子目錄下,并要求子目錄格式為
backupYYYY-mm-dd,備份過程可見
2、創建/app/rootdir目錄,并復制/root下所有文件到該目錄內,要求保留原有權限
練習題答案
1. alias baketc=`cp -av /etc /data/backup`date +%F“ 注意目錄如果/etc/則會失敗或者/etc/*會沒有包含
隱藏文件
2. cp -a /root /data/rootdir
mv移動和重命名文件
mv -i 交互式
mv -f 強制式
如果mv命令的目標和源在相同的文件系統,作為mv 命令用新的文件名創建對應新的目錄項刪除舊目錄條
目對應的舊的文件名不影響inode表(除時間戳)或磁盤上的數據位置:沒有數據被移動!
如果目標和源在一個不同的文件系統, mv相當于cp和rm
rm刪除命令
rm -i 交互式
rm -f 強制刪除
rm -r 遞歸
一般使用 rm -rf
鏈接數遞減,從而釋放的inode號可以被重用把數據塊放在空閑列表中刪除目錄項數據實際上不會馬上被刪
除,但當另一個文件使用數據塊時將被覆蓋。
rename 批量文件改名
rename “conf” “conf.bak” file* 批量備份conf后綴的文件為conf.bak
alias rm=`mv -t /data` rm變為mv到/data文件夾 建議設置
mv /root/Downloads/ /data/ 把目錄移動到/data/目錄下
平時生產中一般磁盤空間大于80%就要報警了
lsof |grep deleted 查看是否有文件已經刪除單沒有釋放空間
例如在本終端刪除文件,而其他終端還有人在訪問該文件
有一個bigfile大文件,則刪除大文件,釋放磁盤空間安全的方法為:
> bigfile
rm -f bigfile
就是利用> bigfile 創建同名文件會覆蓋原大文件變成一個小文件,然后刪除
注意touch命令只是改變3個時間但是不會改變內容
4、tree、mkdir、rmdir
tree
tree命令centos6需要安裝~
tree -L 只顯示第一層 -L 2 顯示1.2層
tree -L -d 只顯示第一層文件夾
mkdir創建目錄
mkdir -p 可以一次創建深目錄
例如 mkdir -p /data/dir1/dir2/dir3/dir4
如果想看到創建過程可以加v
例如mkdir -pv /data/dir1/dir2/dir3/dir4
創建目錄時直接指定權限則可以:
mkdir -m
rmdir 刪除空目錄
如果不是空的也不會刪除
rmdir -p 則是遞歸刪除父空目錄 就是從最低層開始一層層查空目錄如果是空則刪除
例如執行rmdir -d /data/dir1/dir2/dir3/dir4 如果都為空目錄則會直接刪除右邊4個,data是掛載點所以不
會刪除
rm -r 則是遞歸刪除目錄樹不管目錄是不是為空!
習題
(1) 如何創建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a,/testdir/dir1/x/b, /testdir/dir1/y/a,
/testdir/dir1/y/b
(2) 如何創建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b
(3) 如何創建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6,/testdir/dir5/dir7
練習題答案:
1.mkdir -p /testdir/dir1/{x,y}/{a,b}
2.mkdir -p /testdir/dir2/{x/{a,b},y}
3.mkdir -p /testdir/dir{3,4,5/dir{6,7}}
cp /etc/hosts{,.bak} 備份文件
等價于 cp /etc/hosts /etc/hosts.bak
encho file{,b}
則為 file fileb
5、節點編號inode以及節點表、硬鏈接以及軟鏈接
節點編號inode
ls -i 查看節點編號
同一分區中節點編號唯一
inode table 節點表
注意:
節點編號有限如果發現空間沒用光而創建文件失敗則很可能是因為系統節點編號已經用光
touch file{1..52000} 會顯示錯誤因為這樣寫等價于
touch file1 file2…file52000參數太長應該這樣寫
echo file{1..524288} |xargs touch
如果刪除
echo file{1..524288} |xargs rm
或者直接刪除目錄
shred -zv -n 6 hosts 用隨機數據填充空間然后反復覆蓋6次文件hosts
shred -zvu -n 6 hosts 填充完后刪除文件hosts
硬鏈接
ln f1 f2 為文件f1創建硬鏈接f2
文件夾不能創建硬鏈接
文件的初始鏈接數為1,文件夾初始鏈接數為2因為有當前/.這個鏈接
創建硬鏈接只能在同一磁盤分區,因為節點編號跨磁盤分區是不唯一的
硬鏈接的作用就是一個文件有幾個名字
軟鏈接
ln -s f1 f3 為文件f1創建軟鏈接f3
ln -s ../date/f2 /root/f2_link 這里的相對路徑是相對/root的路徑而不是當前目錄的路徑必須注意!
readlink 看軟鏈接指向原始文件
一般生產中部署軟件都用軟鏈接,方便部署,例如nginx-1.10升級到nginx-1.12可用以下方法:
ln -s nginx-1.10 nginx
rm -f nginx
ln -s nginx-1.12 nginx
軟,硬鏈接本質區別:
硬鏈接:同一個文件多個名字
軟鏈接:一個文件對應快捷方式,不同文件
1、鏈接數
2、跨分區
3、目錄
4、原始和鏈接文件關系
5、刪除
6、大小
6、file命令、標準輸入,標準輸出
file 查看文件類型
通過打開文件分析magic number來實現文件分析的
file -f filelist 列出文件filelist中文件名的文件類型
可用nano filelist在里面添加如/etc/hosts /data /bin/ls然后
file -f filelist 顯示3個文件類型信息
標準輸入和輸出
程序:指令+數據
讀入數據:Input
輸出數據:Output
打開的文件都有一個fd: file descriptor (文件描述符)
Linux給程序提供三種I/O設備
標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1 默認輸出到終端窗口
標準錯誤(STDERR)-2 默認輸出到終端窗口
I/O重定向:改變默認位置
ll /proc/$$/fd
查看當前正在打開文件的文件描述符
exec 8<>/data/hosts
直接分配文件描述符8給hosts這個文件
cat /proc/$$/fd/8這時候等價于cat /data/hosts
刪除用exec 8>&_
ls > /dev/pts/5 輸出信息重定向到5號顯示窗口
ls > /data/ls.out 正確信息重定向到文件 隱含有1> (同時如果不存在/data/ls.out則創建文件)
cmd 2>/data/err.log 錯誤信息重定向到文件/data/err.log 不存在則建立文件一個>只覆蓋原內容,》是追
加新內容不覆蓋原內容
ls /error /data >f1 2>f2 正確信息重定向f1 錯誤信息重定向 f2
ls /error /data >all.log 2>&1 正確的錯誤的信息都定向到all.log (對順序敏感不能寫反)
另一種寫法
ls /error /data &>all.log
(ls;pwd)>all.log ls pwd 內容都重定向到all.log
hostname > /dev/null 重定向到黑洞~即沒有內容輸出
>bigfile 即空重定向bigfile即為空
》f1 這樣創建是追加模式更安全 創建文件推薦
特殊內容無法重定向
思考哪個命令效果與眾不同
A cmd > log 2>&1
B cmd 2>&1 > log
C cmd &> log
D cmd 2>log >&2
答案是B
STDOUT和STDERR可以被重定向到文件
命令 操作符號 文件名
支持的操作符號包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
?> 文件內容會被覆蓋
set –C 禁止將內容覆蓋已有文件,但可追加
>| file 強制覆蓋
set +C 允許覆蓋
>> 原有內容基礎上,追加內容把輸出和錯誤重新定向到文件
2> 覆蓋重定向錯誤輸出數據流
2>> 追加重定向錯誤輸出數據流
標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并標準輸出和錯誤輸出為同一個數據流進行重定向
&> 覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (順序很重要)
COMMAND >> /path/to/file.out 2>&1
():合并多個程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
(ls;pwd) > all.log
可以把不需要的信息直接重定向到/dev/null
ls > /dev/null 2>&1
hostname > /dev/null
又比如創建軟鏈接
ln -s all.log all_link
> all_link
這樣會導致原文件all.log內容被清空
標準輸入重定向 例如
cat < /etc/hosts
表示把/etc/hosts文件里的內容用輸入到cat
cat < f1 > f1 會清空文件f1
cat < f1 >> f1 會不斷循環復制f1的內容
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95922