一秸应、文件管理
Linux 系統(tǒng)中有 一切皆文件 的說法摹蘑。
文件是文件
硬件設(shè)備也是文件
就是在 Linux 中管理計算機的任何資源都是使用文件的。
這些資源可以是:
具體的文件和目錄
鍵盤、鼠標、網(wǎng)卡渐逃、主板、CPU民褂、硬盤等茄菊。
1. 關(guān)于對文件的操作命令
touch 創(chuàng)建一個空的普通文件
touch file # 創(chuàng)建一個名為 file 的空文件
cp 復制文件或目錄
cp [選項] 文件1 文件2 ... 目標路徑
若源文件有兩個以上,則最后一個目標文件一定是目錄赊堪。
選項
-a : 相當于-pdr的意思面殖。可將文件的所有屬性一起復制哭廉,可對目錄遞歸操作脊僚。
-p : 與文件的屬性一起復制,而非使用默認屬性群叶。
-d : 若源文件為鏈接文件吃挑,則復制連接文件而非文件本身。
-r : 遞歸復制街立,用于目錄的復制操作舶衬。
-f : 若目標目錄中含有和源文件同名的文件,強制(force)復制赎离,不提示確認逛犹。
-i : 若目標文件已存在,則提示梁剔。
-l : 建立硬鏈接(hard link)的連接文件虽画,而非復制文件本身。
-u : 若目標文件比源文件舊荣病,更新目標文件码撰。
示例
- 復制
a.txt
文件, 到/tmp
目錄中
cp a.txt /tmp/
- 復制
b.txt
文件个盆, 到/tmp
目錄下脖岛,并起名為b.txt.bak
cp b.txt /tmp/b.txt.bak
- 復制
/opt
目錄到/tmp
目錄下
cp -a /opt /tmp/
最佳實戰(zhàn):
當目標是一個目錄時,建議目錄名后面加上路徑分隔符
/
颊亮, 這樣比較易讀柴梆,可以明確的看出來復制后的文件名。假如復制的是一個目錄终惑,建議都加上
-a
選項
rm 刪除文件或目錄
選項
-f : 就是force 的意思绍在,強制刪除。
-i : 交互式刪除雹有。
-r : 對目錄進行遞歸刪除偿渡。
mv 移動文件與目錄,或重命名
選項
-f : 強制移動而不詢問
-i :交互式
-u :若目標文件已經(jīng)存在件舵,且源文件比較新卸察,才會更新
擴展:
其實Linux中還有一個專門進行大量文件重命名的命令 rename,可以man rename查看一下铅祸。
獲取一個路徑的坑质,文件名部分與目錄部分
basename 獲取文件名部分
dirname 獲取目錄部分
例如:
[root@linux~]#basename /etc/sysconfig/network
network 文件名
[root@linux~]#dirname /etc/sysconfig/network
/etc/sysconfig 目錄名
查看文件內(nèi)容
head 查看文件的前幾行
默認顯示前 10 行
選項:
-n :后面接數(shù)字,表示顯示前幾行的意思
tail 顯示文件的后幾行
選項:
-n : 后面接數(shù)字
默認后10行
cat (concatenate)連續(xù)的簡寫临梗,查看文件的全部內(nèi)容
主要功能是將一個文件的內(nèi)容連續(xù)的顯示 在屏幕上涡扼。
當文件內(nèi)容行數(shù)超過40行以上時,不適合用此命令盟庞。注意
由于
cat
命令會把文件的所有內(nèi)容都顯示到屏幕上吃沪,換句話說,就是會把文件的內(nèi)容一次性的讀到內(nèi)存中什猖。
這樣的話票彪,大的文件會把內(nèi)存占滿红淡,從而導致整個系統(tǒng)崩潰。
選項
-n :顯示行號
-A :相當于-vET的整合參數(shù)降铸,可列出一些特殊字符
-E :將結(jié)尾的換行符$顯示出來
-T : 將[Tab]按鍵以^I顯示出來
-v : 列出一些看不出來的特殊字符
tac 倒序的顯示文件的內(nèi)容在旱, 和 cat 相反
cat /etc/issue
less 一頁一頁翻動,可以上下翻動
[PageUP]向上推掸,[PageDown]向下
Less運行過程中
空格鍵: 向下翻動一頁
[PageUP]: 向下翻動一頁
[pageDn]:向上翻動一頁
/字符串: 向下搜索字符串的功能
桶蝎?字符串:想上搜索字符串的功能
n: 重復前一個搜索(與/或?有關(guān))
N: 反向重復前一個搜索(與/或谅畅?有關(guān))
q: 離開less
more 一頁一頁翻動
當more運行過程中登渣,可以操作的按鍵有:
空格鍵:表示向下翻一頁
Enter: 表示向下翻一行
/字符串:表示在這個顯示的內(nèi)容中,向下搜索字符串毡泻,之后按n,可重復向下搜索胜茧。
:f : 立刻顯示文件名以及當前 顯示的行數(shù)
q : 表示立刻離開more
touch [-acdmt] 文件
選項:
-a :僅修改access time
-c :就是文件不存在不建立,存在則修改所以時間為當前時間戳
-d :后面可以接日期牙捉,修改的是 atime 和 mtime
-m:僅修改 mtime
-t :后面可以接時間竹揍,格式為 [[CC]YY]MMDDhhmm[.ss]
關(guān)于 Linu 系統(tǒng)中的 3 個時間
atime
就是 access time 最近訪問內(nèi)容的時間
mtime
就是 modify time 最近修改內(nèi)容的時間
ctime
就是 change time 最近更改文件的時間,包括文件名邪铲、大小芬位、內(nèi)容、權(quán)限带到、屬主昧碉、屬組等。
stat
命令可以查看一個文檔的這三個時間戳:stat anaconda-ks.cfg
? ~ stat anaconda-ks.cfg
File: ‘a(chǎn)naconda-ks.cfg’
Size: 3415 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 268680 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-03-05 17:36:56.000000000 +0000
Modify: 2019-03-05 17:36:56.000000000 +0000
Change: 2019-03-19 10:04:45.376427000 +0000
Birth: -
? ~ touch -a anaconda-ks.cfg
? ~ stat anaconda-ks.cfg
File: ‘a(chǎn)naconda-ks.cfg’
Size: 3415 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3564617 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-07-24 15:18:31.298567000 +0000
Modify: 2019-03-05 17:36:56.000000000 +0000
Change: 2019-07-24 15:18:31.298567000 +0000
Birth: -
? ~ touch -c anaconda-ks.cfg
? ~ stat anaconda-ks.cfg
File: ‘a(chǎn)naconda-ks.cfg’
Size: 3415 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3564617 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-07-24 15:19:33.401400000 +0000
Modify: 2019-07-24 15:19:33.401400000 +0000
Change: 2019-07-24 15:19:33.401400000 +0000
Birth: -
修改更精確的時間
2018 年 8 月 7 日 18 點 18 分
? ~ touch -t 1808071818 anaconda-ks.cfg
1918 年 8 月 7 日 18 點 18 分
? ~ touch -t 191808071818 anaconda-ks.cfg
搜索文件
which 尋找可執(zhí)行文件
參數(shù):
-a :將所有可找到的同名命令都列出來揽惹。默認是只列出第一個找到的命令名稱
一文件查找
grep: 文件內(nèi)容過濾
find: 文件查找被饿,針對文件名
1.1 命令文件
which ls
//從PATH環(huán)境變量 (echo $PATH)
二 find詳解
find [options][path...] [expression][action】
2.1按文件名:
find /etc -name "ifcfg-eth0"
-name 文件名, 后面-print 動作時默認的,已省略
find /etc -iname "ifcfg-eth0"
-i忽略大小寫
find /etc -iname "ifcfg-eth*"
2.2按文件大刑虏:
find /etc -size +5M //大于5M
find /etc -size 5M
find /etc -size -5M
find /etc -size +5M -ls //-ls找到的處理動作, 不是平時用的ls
ll - h 查看大小
2.3指定查找的目錄深度:
-maxdepth levels
-mindepth levels
find / -maxdepth 3 -a -name "ifcfg-eth0" maxdepth 3 最大3層
a要滿足2個條件
并且按時間找(atime,mtime,ctime):
[root@tianyun ~]# find /etc -mtime +5 //修改時間超過5天
[root@tianyun ~]# find /etc -mtime 5 //修改時間等于5天
[root@tianyun ~]# find /etc -mtime -5 //修改時間5天以內(nèi)
2.4按文件類型:
find /dev -type f //f普通
find /dev -type d //d目錄
find /dev -type l //l鏈接
find /dev -type b //b塊設(shè)備
find /dev -type c //c字符設(shè)備
find /dev -type s //s套接字
find /dev -type p //p管道文件
2.5按文件權(quán)限:
find . -perm 644 -ls
. 是當前目錄 精確查找 644 一般都是進行精確查找
find . -perm -644 -ls
-是包含的意思
帶不帶- 自己對比一下查看狭握。
帶-表示只要6就可以
find . -perm -600 -ls
find . -perm -222 -ls //全局可寫
find /usr/bin /usr/sbin -perm -4000 -ls //包含set uid
find /usr/bin /usr/sbin -perm -2000 -ls //包含set gid
find /usr/bin /usr/sbin -perm -1000 -ls //包含sticky
找到后處理的動作 ACTIONS:
-print 默認
-ls 列出結(jié)果文件的屬性,就像 ls -l 的效果
-exec 繼續(xù)執(zhí)行其他命令
|xargs 支持更多參數(shù)
find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;
exec為執(zhí)行一條shell命令 {}為前面的東西; 格式
exec
命令用于調(diào)用并執(zhí)行指令的命令 查找?guī)?root
帶文件 復制到 tmp
下
find /etc -name “root*” -exec cp -rf {} /tmp \;
find /etc -name "ifcfg*" -exec rm -rf {} \;
find . -name "a*" -delete
擴展知識:find結(jié)合xargs*
find . -name "yang*.txt" |xargs rm -rf
重點:
找到之后刪除處理
xargs 把找到的文件名作為參數(shù)傳遞個要處理的程序
案例1: 分別找出file5 和除了file5的文件
[root@tianyun ~]# mkdir dir1
[root@tianyun ~]# touch dir1/file{1..20}
[root@tianyun ~]# find /root/dir1 -name "file5"
[root@tianyun ~]# find /root/dir1 ! -name "file5"
疯溺!為取反
[root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9"
即是file5又是file9
/root/dir1/file5
/root/dir1/file9
三 -exec 和 xargs 的區(qū)別
find . -name 'core' -type f -exec rm {} /;
時论颅,
find -exec
命令會對每個匹配的文件執(zhí)行一個單獨的 rm
操作(execute a separate rm for each one), 正如你手動敲入下面命令:
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core
但是使用這種方式,如果有100個文件匹配了囱嫩,那么就需要啟100個進程恃疯,一個進程處理一個rm命令。一般來說墨闲,其越多進程今妄,意味著越耗性能。我們可以換個思路,我們將要刪除文件當作參數(shù)傳遞給rm不就可以了嗎盾鳞?也就是說
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core
改成:
rm ./bin/core ./source/shopping_cart/core ./backups/core
但是前提是后面的命令必須支持多參數(shù)犬性。
像有些命令,比如unzip腾仅,就不支持輸入多個jar包仔夺,所以必須用-exec。
xargs攒砖,顧名思義,是對參數(shù)進行處理的命令日裙。它的任務(wù)就是將輸入行轉(zhuǎn)換成下一個命令的參數(shù)列表吹艇。因此上面的
find -exec
命令可以改寫成:
find . -name 'core' -type f -print | xargs rm
相比之下,也不難看出各自的缺點
1昂拂、exec 每處理一個文件或者目錄受神,它都需要啟動一次命令,效率不好;
2格侯、exec 格式麻煩鼻听,必須用 {}
做文件的代位符,必須用 \;
作為命令的結(jié)束符联四,書寫不便撑碴。
3、xargs 不能操作文件名有空格的文件朝墩; 綜上醉拓,如果要使用的命令支持一次處理多個文件,并且也知道這些文件里沒有帶空格的文件收苏, 那么使用 xargs比較方便; 否則亿卤,就要用 exec了。
語法:
xargs [-epn] command
選項
-e 后面跟字符串鹿霸,當xargs分析到字符串時就停止,格式為 -e'test' 中間沒有空格,這里的字符串必須和參數(shù)完全匹配
-p 執(zhí)行時詢問
-n 后面接數(shù)字排吴,定義command執(zhí)行時,要使用幾個參數(shù)
- 找出 /sbin 目錄下的文檔懦鼠,并使用 ls -l 列出詳細數(shù)據(jù)
find /sbin -perm +0700 |ls -l $(xargs)
- 把找到的文件復制到 /test 目錄下
find /sbin -perm +0700 | cp $(xargs) /test
關(guān)于減號 - 的用途
可以作為 stdout 和 stdin
tar -cvf - /home | tar -xvf -
二讨阻、目錄管理
1. 系統(tǒng)的目錄樹機構(gòu)詳解
/ 根目錄
├── bin 存放用戶二進制文件
├── boot 存放內(nèi)核引導配置文件
├── dev 存放設(shè)備文件
├── etc 存放系統(tǒng)配置文件
├── home 用戶主目錄
├── lib 動態(tài)共享庫
├── lost+found 文件系統(tǒng)恢復時的恢復文件
├── media 可卸載存儲介質(zhì)掛載點
├── mnt 文件系統(tǒng)臨時掛載點
├── opt 附加的應(yīng)用程序包
├── proc 系統(tǒng)內(nèi)存的映射目錄,提供內(nèi)核與進程信息
├── root root 用戶主目錄
├── sbin 存放系統(tǒng)二進制文件
├── srv 存放服務(wù)相關(guān)數(shù)據(jù)
├── sys sys 虛擬文件系統(tǒng)掛載點
├── tmp 存放臨時文件
├── usr 存放用戶應(yīng)用程序
└── var 存放郵件夺鲜、系統(tǒng)日志等變化文件
2. 符號和目錄的關(guān)系
.
英文的點和蚪,表示當前目錄
..
英文的點點, 表示上層目錄
-
英文的短橫線淑趾, 表示上次離開的目錄
~
英文的波浪號阳仔,表示 當前 用戶的家目錄
~shark
表示 shark 用戶的家目錄
3. 操作目錄的命令
pwd
(print working directory) 顯示當前所在目錄的路徑參數(shù):
-P 顯示出實際路徑,而非使用的軟連接(link)路徑
cd
(change directory) 你想去哪里例如:
cd ~ 到自己的家目錄 cd ~shark 到 shark 用戶的家目錄 cd - 到上次離開的工作目錄
mkdir
(make directory) 建立新目錄參數(shù):
-m 創(chuàng)建新目錄的同時,設(shè)置該目錄的權(quán)限近范。直接設(shè)置嘶摊,會忽略默認權(quán)限。
-p 直接建立所需的目錄遞歸评矩。例如:
mkdir -p /a/b/c
rmdir
(rmove directory) 刪除空目錄參數(shù):
-p 遞歸刪除空目錄
tree
遞歸查看目錄結(jié)構(gòu)參數(shù):
-L n 表示查看到第 n 層的目錄
三叶堆、文件內(nèi)容操作
cut 字段分隔
grep 關(guān)鍵字搜索
grep [-acinv] [--color=auto] '搜尋字符串' filename
選項:
-a //將binary 文件以text文件的方式搜索數(shù)據(jù)
-c //計算找到的字符串的次數(shù)
-i //忽略大小寫
-n //輸出行號
-v //反向選擇
排序、統(tǒng)計命令: sort wc uniq
sort 排序
可以依據(jù)不同的數(shù)據(jù)型態(tài)來排序
sort [-fbMnrtuk] [file or stdin]
選項不參數(shù):
-f :忽略大小寫
-b :忽略最前面的空格符部分斥杜;
-n : 使用『純數(shù)字』進行排序(默認是以文字型態(tài)來排序的)虱颗;
-r :反向排序;
-u :就是 uniq 蔗喂,相同的數(shù)據(jù)中忘渔,僅出現(xiàn)一行代表;
-t :分隔符缰儿,預設(shè)是用 [tab] 鍵來分隔畦粮;
-k :以那個區(qū)間 (field) 來進行排序的意思
示例文件內(nèi)容
4349 shark
264 shark
924 xiguatian
924 tian
734 yangge
823 shark
734 yangge
sortt sort.txt
sort -n sort.txt
uniq 去重+統(tǒng)計數(shù)量
可以將重復的數(shù)據(jù)僅列出一個來顯示,且可以進行統(tǒng)計
uniq [-ic]
選項:
-i //忽略大小寫
-c //進行統(tǒng)計
例如:我想要知道每個人登入服務(wù)器的總次數(shù)乖阵,可以這樣:
[root@testhost ~]# last | cut -d ' ' -f1 |sort|uniq -c
wc 字符宣赔、行統(tǒng)計
tr 字符替換
cat /etc/passwd | tr -d ':' //將冒號刪除
last | tr '[a-z]' '[A-Z]' //所有小寫變成大寫
tee 雙向輸出
cat anaconda-ks.cfg | tee an.bak