文件系統之文件操作02
0.概述
本期將帶大家進入Linux文件操作的第二部分.
我會帶大家使用命令行做如下操作.
-
mkdir 創建文件夾
-
touch 創建一個文件
-
vim /geidt/vscode 編輯文件
-
cat 查看文件
-
cp 復制
-
mv 移動
-
rmdir 刪除文件夾
-
rm 刪除文件/文件夾
實例教學, 跟著教程的操作 ,自己也同時邊看邊敲命令行.
這篇文章相比較前幾篇文章比較長一些, 希望大家可以耐心看下去.
1. mkdir - 創建文件夾
學習了如何進入一個文件夾(cd)與查看文件目錄(ls)之后, 接下來我們要嘗試創建一個自己的文件夾.
我們暫且稱之為Akai
這里我們需要一個新的指令叫mkdir
英文全稱叫做make directory
創建一個文件夾/目錄
-
mk
: make -
dir
: directory linux常用于表示文件夾
mkdir Akai
這個時候,我們調用ls
指令,就可以看到我們新創建一個文件夾.
[email protected] ~/D/fange_opencv_tutorial> ls | grep F Akai Feature特征檢測
grep
指令, 去篩選F
打頭的文件夾/文件.
我們在這里先不深入介紹grep
, 目前只需要知道, 它是用于篩選滿足一些特征(例如開頭字符, 正則表達式等等)的結果的工具.
好, 看到我們新創建的文件夾之后, 我們進入到里面去.順便回顧一下我們的cd
指令.
[email protected] ~/D/fange_opencv_tutorial> cd Akai/ [email protected] ~/D/f/Akai> ls [email protected] ~/D/f/Akai> pwd /home/scorpion/Desktop/fange_opencv_tutorial/Akai
我們可以看到文件夾下空空如也.
2. touch - 創建一個文件
在linux里面, 如果我們要創建一個空文件, 我們就需要使用 touch
touch
后面加文件名稱.
暫時沒有參透它命名英文的簡寫, 知道的朋友可以給我留言.
[email protected] ~/D/f/Akai> touch hello.txt [email protected] ~/D/f/Akai> ls hello.txt [email protected] ~/D/f/Akai>
Akai
這個目錄下面, 創建了一個名叫hello.txt
的文本.
實際上touch
在linux的默認用法是修改當前文件的時間戳timestamp
為系統當前的時間, 如果文件不存在的話, 就會被創建一個空文件.
我們這里只涉及它創建一個文件的用法.
Update the access and modification times of each FILE to the current time.
3. gedit - 使用圖形化的編輯器
創建了一個文件之后, 我們總想給這個文件里寫點啥, 例如想留言一首木心先生的溫暖的小詩.
從前慢 --木心 記得早先少年時 大家誠誠懇懇 說一句 是一句 清早上 火車站 長街黑暗無行人 賣豆漿的小店冒著熱氣 從前的日色變得慢 車,馬,郵件都慢 一生只夠愛一個人 從前的鎖也好看 鑰匙精美有樣子 你鎖了 人家就懂了
你可以使用命令行版本的編輯器vim
, 但是為了不給自己入手添加太多的阻礙, 建議先對基礎的命令行熟悉之后, 再繼續深入學習其他的工具或者編輯器.
我們還是樸實一點, 用圖形化的編輯器
gedit hello.txt
運行圖形化界面, 填入我們的文字.
CTRL + S
保存我們寫的這段優美的文字.
4. vscode 一款更好用的編輯器
使用我們XCore
開發板的用戶, 我們為大家預裝了vscode
. 大家運行code
指令打開單個文件, 或者打開整個工程目錄.
打開當前的文件夾
code .
code /home/scorpion/Desktop/fange_opencv_tutorial/Akai
code hello.txt
這個圖形化編輯器的更多功能還等大家自己去探索.
5. cat - 在終端預覽文件內容.
cat
這個指令, 它取一個或多個文本文件的名稱,然后將其內容作為一個數據流顯示到標準輸出。
concatenate files and print on the standard output
例如我們可以執行下面這條指令, 讓文件中的內容打印到終端上面
cat hello.txt
[email protected] ~/D/f/Akai> cat hello.txt 從前慢 --木心 記得早先少年時 大家誠誠懇懇 說一句 是一句 清早上 火車站 長街黑暗無行人 賣豆漿的小店冒著熱氣 從前的日色變得慢 車,馬,郵件都慢 一生只夠愛一個人 從前的鎖也好看 鑰匙精美有樣子 你鎖了 人家就懂了
實際上我日常使用的時候, 會加一個箭頭的符號>
, <
. 它代表數據流的方向.
cat < hello.txt
<
代表數據流向是終端. >
代表數據流向是文件.
也就是說我們執行linux指令,或者在終端運行某個軟件, 輸出的字符信息或者我們稱之為日志信息都可以導入到文件中.
還記得我們之前提到過的echo
指令么.
echo 'MrFange'
echo
語句會導出一個數據流, 我們將其存到一個文件中, 這里我們導入到一個名字叫做Akai-echo.txt
的文件中. 注意,文件不必提前創建touch
, 它會自動生成.
[email protected] ~/D/f/Akai> echo 'MrFange' > Akai-echo.txt [email protected] ~/D/f/Akai> ls Akai-echo.txt hello.txt [email protected] ~/D/f/Akai> cat Akai-echo.txt MrFange
再列舉一個例子, 我們在當前目錄下執行ls語句, 并將其結果輸出到ls-record.txt
的文件中.
[email protected] ~/D/f/Akai> ls > ls-record.txt [email protected] ~/D/f/Akai> cat < ls-record.txt Akai-echo.txt hello.txt ls-record.txt
6. cp - 拷貝文件/文件夾
接下來, 我們要將之前寫有小詩的hello.txt
復制一份另存為poem.txt
這里我們需要cp
指令, 英文全稱是copy
是復制的意思.
[email protected] ~/D/f/Akai> cp hello.txt poem.txt [email protected] ~/D/f/Akai> cat < poem.txt 從前慢 --木心 記得早先少年時 大家誠誠懇懇 說一句 是一句 清早上 火車站 長街黑暗無行人 賣豆漿的小店冒著熱氣 從前的日色變得慢 車,馬,郵件都慢 一生只夠愛一個人 從前的鎖也好看 鑰匙精美有樣子 你鎖了 人家就懂了
我們掌握了復制的技能, 那我們可不可以復制整個文件夾呢, 我們試一下.
我們需要退回到上層目錄.
cd ..
[email protected] ~/D/fange_opencv_tutorial> cp Akai/ Akai-Copy cp: -r not specified; omitting directory 'Akai/'
尷尬, 它提示有錯誤了, 說我們沒有指定拷貝對象.
這里我們就需要cp
指定其中一個參數
-R, -r, --recursive copy directories recursively
遞歸
的方法是拷貝文件夾. 沒接觸過算法的同學, 可能對遞歸
比較陌生.
這個時候, 你可能需要去百度一下, 或者搜索一下漢娜塔問題.
簡單來講, 就是我先復制這個文件夾, 然后文件夾內的內容繼續拷貝.
[email protected] ~/D/fange_opencv_tutorial> cp -r Akai/ Akai-Copy
展示一下結果
[email protected] ~/D/fange_opencv_tutorial> ls | grep Akai Akai Akai-Copy [email protected] ~/D/fange_opencv_tutorial> cd Akai-Copy/ [email protected] ~/D/f/Akai-Copy> tree . ├── Akai-echo.txt ├── hello.txt ├── ls-record.txt └── poem.txt 0 directories, 4 files
我們退回原來的文件夾.
7. mv 移動/重命名
我們可以使用mv
(英文是 move
)指令來移動文件夾的位置或者將其重命名(在同一目錄就相當于重命名了)
例如我們之前創建的那個hello.txt
, 現在我想將其重命名為cong-qian-man.txt
.
[email protected] ~/D/f/Akai> mv hello.txt cong-qian-man.txt [email protected] ~/D/f/Akai> ls cong-qian-man.txt Akai-echo.txt ls-record.txt poem.txt
我們可以將這個文件移動到別的地方去, 例如移動到我們之前創建的Akai-Copy
文件夾內.
[email protected] ~/D/f/Akai> mv cong-qian-man.txt ../Akai-Copy/ [email protected] ~/D/f/Akai> cd ../Akai-Copy/ [email protected] ~/D/f/Akai-Copy> tree . ├── cong-qian-man.txt ├── Akai-echo.txt ├── hello.txt ├── ls-record.txt └── poem.txt 0 directories, 5 files
PS: 為啥很嘮叨的去做這么多演示示例, 從的教學理念來講, 輸入決定產出, 你只有看別人的操作樣例多了之后, 你才能熟練掌握這里指令的使用. 多練之前一定要多看. 切記.
我們可以看到cong-qian-man.txt
已經成功地放置在Akai-Copy
這個文件夾內了.
那接下來要給大家演示一下, 如何移動/重命名文件夾.
mv
指令, 第一個傳入的是源文件夾, 第二個參數是目的文件夾.
如果Akai-Copy2
這個文件夾不存在, 這個語句就相當于rename 重命名
如果Akai-Copy2
這個文件夾存在,提前創建好. 那么這句指令的意思就變成了, 將Akai-Copy
這個文件夾, 移動到Akai-Copy2
這個目錄下. 也就是Akai-Copy2
包含Akai-Copy
這個目錄.
大家可以自行實驗一下.
mv Akai-Copy/ Akai-Copy2/
[email protected] ~/D/fange_opencv_tutorial> pwd /home/scorpion/Desktop/fange_opencv_tutorial [email protected] ~/D/fange_opencv_tutorial> mv Akai-Copy/ Akai-Copy2/ [email protected] ~/D/fange_opencv_tutorial> ls | grep Akai Akai Akai-Copy2
[email protected] ~/D/fange_opencv_tutorial> cd Akai-Copy2/ [email protected] ~/D/f/Akai-Copy2> tree . ├── cong-qian-man.txt ├── Akai-echo.txt ├── hello.txt ├── ls-record.txt └── poem.txt 0 directories, 5 files
8. rm - 刪除文件/目錄
分別總是難免的, 有些文件創建出來就是為了被刪除的, 因為它的效能已經發揮完畢.
rm
是remove
的縮寫是刪除的意思. rm
后面緊跟文件名, 就是刪除這個文件.
[email protected] ~/D/f/Akai-Copy2> ls cong-qian-man.txt Akai-echo.txt hello.txt ls-record.txt poem.txt [email protected] ~/D/f/Akai-Copy2> rm hello.txt [email protected] ~/D/f/Akai-Copy2> rm ls-record.txt poem.txt [email protected] ~/D/f/Akai-Copy2> ls cong-qian-man.txt Akai-echo.txt
需要提的是, 你可以給rm
傳入多個參數, 很多指令都支持傳入多個參數. 可以同時刪除多個文件.
當然最有效的方式, 我們還是刪除整個文件夾.
如果你的文件夾是空文件夾的話, 你可以使用rmdir
指令(Remove Directory) 刪除文件夾.
[email protected] ~/D/f/Akai-Copy2> ls cong-qian-man.txt Akai-echo.txt #創建文件夾 tmp [email protected] ~/D/f/Akai-Copy2> mkdir Tmp [email protected] ~/D/f/Akai-Copy2> ls Tmp/ cong-qian-man.txt Akai-echo.txt # 刪除空文件夾 [email protected] ~/D/f/Akai-Copy2> rmdir Tmp/ [email protected] ~/D/f/Akai-Copy2> ls cong-qian-man.txt Akai-echo.txt
但是, 如果你的文件夾非空, 使用設個指令就會出錯
[email protected] ~/D/fange_opencv_tutorial> rmdir Akai-Copy2/ rmdir: failed to remove 'Akai-Copy2/': Directory not empty
我們只能借助rm
指令, 需要填入一個選項-r
遞歸操作. 這樣我們就成功刪除了整個Akai-Copy2
文件夾里面的內容及其本身.
[email protected] ~/D/fange_opencv_tutorial> rm -r Akai-Copy2/ [email protected] ~/D/fange_opencv_tutorial> ls | grep Akai Akai
江湖上流傳, 有一個必殺的指令叫
sudo rm -fr /
sudo
是以管理員權限運行該指令.
之前提到過/
指的是根目錄. rm
刪除 -r
代表遞歸, -f
force代表強制.
具體會發生什么, 大家可以腦補一下.
其實目前很多linux
的發行版, 例如Ubuntu
是受到保護的, 默認這樣做是被攔截的, 除非添加一些其他選項.
如果大家感興趣, 可以參照知乎的這篇文章
在現代的Unix操作系統上執行sudo rm -rf /會發生什么?
https://www.zhihu.com/question/21682570
9. Summary小結
本次帶大家完成了linux使用命令行進行文件操作, 基本上已經覆蓋了常見的需求. 簡單總結一下.
我們學習了:
mkdir-創建文件夾
mkdir + 文件名稱
touch-創建文件
touch + 文件名
編輯器的使用
這里主要介紹了gedit
跟vscode
從命令行的啟動方法.
gedit
gedit + 文件名
code + 文件名 code + 文件夾路徑
cat 文件流的輸出
# 將文件中的內容, 打印到終端 cat + 文件名 cat < 文件名 # 將數據存放在文件中 cat > 文件名
cp 復制
復制文件
cp + 源文件名/路徑 + 目的文件名/路徑
-r
表示遞歸
cp -r 源文件夾名/路徑 + 目的文件夾名/路徑
mv - 移動位置
移動/重命名文件
mv + 源文件 + 目的文件
# 刪除空文件夾 rmdir + 文件夾名稱 # 刪除非空文件夾 rm -r + 文件夾名稱/路徑