1. 程式人生 > >Linux 基本shell命令和Linux rm -rf原理分析

Linux 基本shell命令和Linux rm -rf原理分析

還是老規矩,循序漸進,先來簡單入門一下Linux

Linux中一切皆檔案,所以我們應該知道的是Linux中只有一個根目錄,然後分為下圖幾個目錄,其中桌面在home 目錄下,圖(來源網上):

這裡寫圖片描述

cd

> cd 目的地   --(..代表父目錄,.代表當前目錄)   

一開始開啟的終端模擬器是預設在桌面目錄下開啟的,即$前面有個~號。
這裡寫圖片描述

pwd

> pwd                --顯示當前路徑

ls

> ls                    --顯示當前目錄下的檔案(夾)

這裡寫圖片描述
這裡寫圖片描述

-R

> 遞迴的作用           --配合使用

這裡寫圖片描述
這裡寫圖片描述

-i

> 詢問資訊      --配合使用

touch

建立空檔案

mkdir

建立空目錄

cp

> cp   原始檔   目的檔案        ----複製原始檔

mv

> mv 原始檔  目的檔案    ---移動,原始檔消失

rm/rmdir

rm 刪除原始檔 / rmdir 刪除空目錄

file

> file 原始檔    ---檢視檔案型別

這裡寫圖片描述
這裡寫圖片描述

cat

cat 原始檔 –檢視檔案內容
cat 原始檔 -n 帶行號(包括空行)顯示
cat 原始檔 -b 帶行號顯示(只包括文字)
cat 原始檔 -T 不讓製表符(用^I代替)出現

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

more/less

> more/less  原始檔   --檢視大檔案,以頁的方式檢視

tail/head

> tail/head  原始檔 -n    --檢視大檔案內容的尾部和頭部n行

tree

一種展示目錄的美觀工具,sudo apt install tree可安裝

這裡寫圖片描述
這裡寫圖片描述

rm -rf

rm -rf -i 源目錄 (r是遞迴刪除,f是強制刪除,i是提示資訊)

這裡寫圖片描述

這裡寫圖片描述

遞迴刪除是不是很神奇,這倒是讓我產生了濃厚的興趣,遂進行了一番研究,以下內容參考自:Linux rm刪除檔案原理

維基百科
這裡寫圖片描述


這裡寫圖片描述
硬連結

(無法給目錄新增)
這裡寫圖片描述
符號連結(可以給目錄新增)
這裡寫圖片描述

只能夠在處於同一儲存媒體的檔案建立硬連結。要想在不同儲存媒體的檔案之間建立連結,只能使用符號連結。
檔案 或目錄的inode編號是一個用於標識的唯一數字,這個數字由核心分配給檔案系統中的每一個物件,要想檢視檔案或目錄的inode編號,可以給ls命令加入-i引數

很多時候,我們都會發現,某個程序在對當前檔案讀寫,但是我們依然能夠rm, 是不是很奇怪?而windows下面,肯定會報錯,”當前檔案正在被使用“, 這就得從linux下面刪除檔案的原理說起了。
  
這裡寫圖片描述
這裡寫圖片描述

  
   Linux是通過link的數量來控制檔案刪除的,只有當一個檔案不存在任何link的時候,這個檔案才會被刪除。一般來說,每個檔案都有2個link計數器:i_count 和 i_nlink。
  
   i_count的意義是當前檔案使用者(或被呼叫)的數量,i_nlink 的意義是介質連線的數量(硬連結的數量);可以理解為i_count是記憶體引用計數器,i_nlink是磁碟的引用計數器。
  
  當一個檔案被某一個程序引用時,對應i_count數就會增加;當建立檔案的硬連結的時候,對應i_nlink數就會增加。
  
   對於刪除命令rm而言,實際就是減少磁碟引用計數i_nlink。這裡就會有一個問題,如果一個檔案正在被某個程序呼叫,而使用者卻執行rm操作把檔案刪除了,那麼會出現什麼結果呢?當用戶執行rm操作刪除檔案後,再執行ls或者其他檔案管理命令,無法再找到這個檔案了,但是呼叫這個刪除的檔案的程序卻在繼續正常執行,依然能夠從檔案中正確的讀取及寫入內容。這又是為什麼呢?
  
  這是因為rm操作只是將檔案的i_nlink減少了,如果沒其它的連結i_nlink就為0了;但由於該檔案依然被程序引用,因此,此時檔案對應的i_count並不為0,所以即使執行rm操作,但系統並沒有真正刪除這個檔案,當只有i_nlink及i_count都為0的時候,這個檔案才會真正被刪除。也就是說,還需要解除該程序的對該檔案的呼叫才行。
  
  以上講的i_nlink及i_count是檔案刪除的真實條件,但是當檔案沒有被呼叫時,執行了rm操作刪除檔案後是否還可以找回被刪的檔案呢?
  
  前面說了,rm操作只是將檔案的i_nlink減少了,或者說置0了,實際就是將檔名到inode的連結刪除了,此時,並沒有刪除檔案的實體即(block資料塊),此時,如果及時停止機器工作,資料是可以找回的,如果此時繼續寫入資料,那麼當新資料就可能會被分配到被刪除的資料的block資料塊,此時,檔案就會被真正的回收了

備註:根據以上原理,實際情況會出現以下問題,web伺服器磁碟空間不夠了,刪除了所有無用日誌還是顯示磁碟空間不足,但是用du -sh /*發現磁碟空間佔用的遠小於硬碟總大小,這就是因為只刪除了一個i_nlink,而還有其他程序在使用著這些log檔案,apache或者tomcat,重啟再看就ok了。

補充:

df命令詳細用法
a:顯示全部的檔案系統和各分割區的磁碟使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (預設值)
t:顯示某一個檔案系統的所有分割區磁碟使用量
x:顯示不是某一個檔案系統的所有分割區磁碟使用量
T:顯示每個分割區所屬的檔案系統名稱
h:動態顯示易讀的格式
常用命令:df -hi

du:查詢檔案或目錄的磁碟使用空間
a:顯示全部目錄和其次目錄下的每個檔案所佔的磁碟空間
b:大小用bytes來表示 (預設值為k bytes)
c:最後再加上總計 (預設值)
s:只顯示各檔案大小的總合 (summarize)
x:只計算同屬同一個檔案系統的檔案
L:計算所有的檔案大小
常用命令:du -a

系統管理命令:
start:顯示指定檔案的相關資訊,比ls命令顯示的內容更多
who,w:顯示線上登入使用者
whoname :顯示使用者自己的身份
hostname:顯示主機名稱
uname:顯示系統資訊
top:顯示當前耗費資源最多的程序
ps:顯示瞬間程序狀態
du:顯示檔案已使用磁碟空間的總量
free:顯示當前記憶體和交換空間的使用情況
ifconfig:顯示網路介面資訊
ping:測試網路的連通性
man:命令幫助資訊查詢
Alias:設定命令別名

alias[別名]=[“指令名”]

Clear:清屏
Kill:殺死程序

這裡寫圖片描述

dpkg和apt get的區別:
兩者的區別是dpkg繞過apt包管理資料庫對軟體包進行操作,所以你用dpkg安裝過的軟體包用apt可以再安裝一遍,系統不知道之前安裝過了,將會覆蓋之前dpkg的安裝。

1、dpkg是用來安裝.deb檔案,但不會解決模組的依賴關係,且不會關心ubuntu的軟體倉庫內的軟體,可以用於安裝本地的deb檔案。
2、apt會解決和安裝模組的依賴問題,並會諮詢軟體倉庫, 但不會安裝本地的deb檔案, apt是建立在dpkg之上的軟體管理工具。

dpkg軟體管理工具:(基於Debian)
dpkg –info “軟體包名” –列出軟體包解包後的包名稱.
dpkg -l –列出當前系統中所有的包.可以和引數less一起使用在分屏檢視.
dpkg -l |grep -i “軟體包名” –檢視系統中與”軟體包名”相關聯的包.
dpkg -s 查詢已安裝的包的詳細資訊.
dpkg -L 查詢系統中已安裝的軟體包所安裝的位置.
dpkg -S 查詢系統中某個檔案屬於哪個軟體包.
dpkg -I 查詢deb包的詳細資訊,在一個軟體包下載到本地之後看看用不用安裝(看一下唄).
dpkg -i 手動安裝軟體包(這個命令並不能解決軟體包之前的依賴性問題),如果在安裝某一個軟體包的時候遇到了軟體依賴的問題,可以用apt-get -f install在解決信賴性這個問題.
dpkg -r 解除安裝軟體包.不是完全的解除安裝,它的配置檔案還存在.
dpkg -P 全部解除安裝(但是還是不能解決軟體包的依賴性的問題)
dpkg -reconfigure 重新配置

apt高階包管理工具
軟體源設定 /etc/apt/sources.list
更新軟體源資料 apt-get update
更新已安裝軟體 apt-get upgrade
更新系統版本 apt-get dist-upgrade
通過安裝包或解除安裝包來修復依賴錯誤 apt-get -f install
搜尋軟體源資料 apt-cache search foo
解壓安裝軟體包 apt-get install foo
重新安裝軟體包 apt-get –reinstall install foo
刪除軟體包釋放的內容 apt-get remove foo
解除安裝軟體,同時清除該軟體配置檔案 apt-get –purge remove foo
刪除不需要的包 apt-get autoclean
刪除所有已下載的包 apt-get clean

在用命令apt-get install之前,是先將軟體包下載到/var/cache/apt/archives中,之後再進行安裝的.所以我們可以用apt-get clean清除/var/cache/apt/archives目錄中的軟體包.
原始碼包安裝

自動安裝編譯一軟體所需要的包 apt-get build-dep foo

再次梳理一下:
檔案目錄操作指令:
ls:顯示檔案和目錄列表
mv:移動檔案或目錄,檔案或重名
-l:列出檔案的詳細資訊
- find:查詢指定的檔案
-a:列出當前目錄的所有檔案,包含隱藏檔案
-name:檔名
mkdir:建立目錄
wc:統計文字文件的行,字,字數
-p:父目錄不存在的情況下先生成父目錄
grep:查詢指定字元
cd:切換目錄
rmdir:刪除空目錄
touch:生成一個空檔案
tree:顯示目錄,目錄改名為樹
echo:生成一個帶內容的檔案
pwd:顯示當前的工作目錄
cat,tac:顯示文字檔案的內容
ln:建立連結檔案
cp:複製檔案或目錄
more,less:分頁顯示文字檔案內容
rm:刪除檔案
Head,tail:顯示檔案開頭和結尾內容
-r:同時刪除該目錄下的所有檔案
-f:強制刪除檔案或目錄

小結

總體來說,這篇博文的產生是來源於tree和rm -rf -i的操作引起的,因為看見了刪除過程中的遞迴刪除,先進行遞到末目錄,然後歸來刪除。再接再厲吧,感覺Linux還是挺有意思的。

相關推薦

Linux 基本shell命令Linux rm -rf原理分析

還是老規矩,循序漸進,先來簡單入門一下Linux Linux中一切皆檔案,所以我們應該知道的是Linux中只有一個根目錄,然後分為下圖幾個目錄,其中桌面在home 目錄下,圖(來源網上): cd > cd 目的地 --(..代表父目錄,.代表

nginx學習(三) 使用shell命令linux定時任務完成nginx日誌管理

1.編寫shell指令碼 建立shell指令碼目錄和指令碼 mkdir /data cd /data vim runlog.sh 編寫指令碼 # /bin/bash LOGPATH=/usr/local/nginx/logs/zcom.access.log /

LinuxShell命令的輸出信息同時顯示在屏幕保存到日誌文件中

blog inux -a 輸出 輸出內容 使用 col 文件中 信息 #直接覆蓋日誌文件 ls -l | tee ./t.log #將輸出內容附加到日誌文件 ls -l | tee -a ./t.log 使用的是tee命令Linux下She

Linuxshell命令用法例項總結:du

完整的Linux下Shell命令總結歸檔於IT老兵部落格。 命令格式 du [選項] [檔案] 命令功能 du(disk usage 的簡稱)命令用於檢查計算機上檔案和目錄的磁碟使用情況,可以遞迴顯示檔案和目錄。顯示每個檔案和目錄的磁碟使用空間。 命令引數

Linux的基礎命令Shell指令碼

一、計算機   1、能接收使用者輸入的指令和資料,經過中央處理器的算術邏輯單元處理,然後會產生或者顯示新資料的,就是計算機。    比如,普通商戶用的計算器,手機,提款機,汽車導航,桌面電腦,手提電腦等   2、計算機

Linux進階命令Shell程式設計

1.高階文字命令——sed 1.1sed簡介 sed全稱是:Stream EDitor,即流編輯器,是一個很好的文字處理工具,本身是一個管道命令,處理時,把當前處理的行儲存在臨時緩衝區中,接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往

關於linux的export命令shell變數的生命週期,環境變

原文來自:http://www.cppblog.com/mydriverc/archive/2009/09/16/96476.html export:將自定義變數設定為系統環境變數(當前shell中有效) 功能說明:設定或顯示環境變數。 語  法:export  [-

關於linux的export命令shell變數的生命週期,環境變數

[-fnp][變數名稱]=[變數設定值]補充說明:在shell中執行程式時,shell會提供一組環境變數。export可新增,修改或刪除環境變數,供後續執行的程式使用。export的效力僅及於該此登陸操作。參  數:  -f  代表[變數名稱]中為函式名稱。   -n  刪除指定的變數。變數實際上並未刪除,只

Linux 搭建java環境 Linux基本命令(最基本的)

首先需要一個Linux的伺服器,阿里雲 騰訊雲的 最低配就行了 有問題聯絡 qq:185624592 所需要的工具: 1. Xshell                有免費的學生學習版本 2. Xftp             也有免費學生學習版

Linux基本操作命令

程序 詳細 位置 tool -1 擁有 Owner ss命令 單位 一、 ls ls最常用的參數有三個: -a -l -F 1、ls -a Linux上的文件以.開頭的文件被系統視為隱藏文件,僅用ls命令是看不到他們的,而用ls -a除了顯示 一般文件名外,連隱藏文

Linux 基本bash命令

inux 信息 bsp 詳解 目前 查看內存 ash java htm 1、查看文件大小、內存大小、cpu信息、硬盤空間 顯示當前目錄所有文件大小的命令:ls -lht 內存空間、CPU信息、硬盤空間:htop、top(htop詳解參考:http://blog

Linux修改Shell命令提示符及顏色

br0 小時 spa 日期 背景顏色 red 24小時 信息 pan 1. Linux登錄過程中加載配置文件順序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc → [/etc/bashrc

Linux系列教程(五)——Linux鏈接命令權限管理命令

密碼 mission pos link 掩碼 Owner 最大的 linux系統 passwd   前一篇博客我們講解了Linux文件和目錄處理命令,還是老生常淡,對於新手而言,我們不需要完全記住命令的詳細語法,記住該命令能完成什麽功能,然後需要的時候去查就好了,用的多了我

linux基本操作命令的使用

lin usr 查看 特殊符號 nbsp files 進一步 image mem 為了盡快完成對公司的linux服務器的部署,安裝,操作,需要進一步學習Linux系統中基本的文件和目錄管理命令,同時要熟悉獲取命令幫助的常用方法以便及時了解與服務器管理、維護相關的其他命令的用

Linux基本常用命令之ls詳解(含date,cal)

Linux基礎【1】顯示日期的指令:date示例:(1)#date +%Y/%m/%d結果:2018/02/27(2)#date +%H:%M結果:10:48【2】顯示日歷的指令:cal格式:cal [month] [year]示例:(1)#cal 2 2018(2)#cal 13 2018結果:cal:il

Linux基本命令使用

-a 追加 touch 大小 通配符 運用 歷史 主目錄 替換 1.1ls -a 顯式所有文件,包括隱藏文件 1.2 ls -l 列表形式顯式文件名稱 1.3 ls -l -h 列表顯式大小和名稱 也可以這樣寫 ls -alh (-可以省略) 重定向 ls -alh

Linux基本權限特殊權限管理

Linux的權限管理 特殊權限 ACL權限 基本權限UGO u 所屬主 g 所屬組 o 其他人 r (4)讀 read w(2)寫 write x(1)執行 execute 針對文件: ? r 讀 是否允許可以查看文件的內容 ?

LINUX學習—使用者命令許可權

使用者、組、許可權 許可權: r,w, x - 檔案: -- r:可讀,可以用cat檢視檔案內容 -- w:可寫 -- x:可執行 - 目錄: -- r:可以對此目錄執行ls以列出內部的 所有檔案: -- w:可以在此目錄

Linux 內建命令系統命令

1.什麼是build in命令: shell內建命令是指bash(或其它版本)工具集中的命令。一般都會有一個與之同名的系統命令,比如bash中的echo命令與/bin/echo是兩個不同的命令,儘管他們行為大體相仿。當在bash中鍵入一個命令時系統會先看他是否是一個內建命令,如果不是才會檢視是否是系統

Linux的rsync命令歸檔、壓縮

一、Linux的rsync命令 1.rsync與scp的區別      scp是複製和rsync是同步,rsync和scp在資料夾均不存在時,執行時間相差不大,但是資料夾存在的情況下差異很大。因為scp是複製:若目的地檔案不存在則新建,若存在