# 練習 4:Bash:處理文件,`pwd`,`ls`,`cp`,`mv`,`rm`,`touch`
> 原文:[Exercise 4. Bash: working with files, pwd, ls, cp, mv, rm, touch](https://archive.fo/xb8YB)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
在 Linux 中,一切都是文件。但是什么是文件?現在完全可以說,它是一個包含一些信息的對象。它通常[定義](http://en.wikipedia.org/wiki/Computer_file)如下:
> 計算機文件是用于存儲信息的,任意的信息塊或資源。它可用于計算機程序,并且通常基于某種持久的存儲器。文件是持久的,因為它在當前程序完成后,仍然可用于其它程序。計算機文件可以認為是紙質文檔的現代對應物,它們通常保存于辦公室和圖書館的文件中,這是該術語的來源。
但這個定義太籠統了,所以讓我們更具體一些。`man stat`告訴我們,文件是一個對象,它包含以下屬性:
```c
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
```
不要害怕,只要記住以下屬性:
+ 大小,這正好是它所說的。
+ 上次訪問的時間,當你查看文件時更新。
+ 上次修改的時間,當你更改文件時更新。
現在你將學習如何打印當前目錄,目錄中的文件,復制和移動文件。
## 這樣做
```
1: pwd
2: ls
3: ls -a
4: ls -al
5: ls -altr
6: cp -v .bash_history{,1}
7: cp -v .bash_history1 .bash_history2
8: mv -v .bash_history1 .bash_history2
9: rm -v .bash_history2
10: touch .bashrc
11: ls -al
12: ls .*
```
## 你應該看到什么
```
Hello, user1!
user1@vm1:~$ pwd
/home/user1
user1@vm1:~$ ls
user1@vm1:~$ ls -a
. .. .bash_history .bash_history1 .bash_logout .bashrc .lesshst .profile .profile.bak .profile.bak1
user1@vm1:~$ ls -al
total 40
drwxr-xr-x 2 user1 user1 4096 Jun 7 13:30 .
drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
-rw------- 1 user1 user1 853 Jun 7 15:03 .bash_history
-rw------- 1 user1 user1 308 Jun 7 13:14 .bash_history1
-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
-rw-r--r-- 1 user1 user1 3184 Jun 6 21:48 .bashrc
-rw------- 1 user1 user1 45 Jun 7 13:31 .lesshst
-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile
-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak
-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1
user1@vm1:~$ ls -altr
total 40
-rw-r--r-- 1 user1 user1 3184 Jun 6 21:48 .bashrc
-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak
-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile
-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1
-rw------- 1 user1 user1 308 Jun 7 13:14 .bash_history1
drwxr-xr-x 2 user1 user1 4096 Jun 7 13:30 .
-rw------- 1 user1 user1 45 Jun 7 13:31 .lesshst
-rw------- 1 user1 user1 853 Jun 7 15:03 .bash_history
user1@vm1:~$ cp -v .bash_history{,1}
`.bash_history' -> `.bash_history1'
user1@vm1:~$ cp -v .bash_history1 .bash_history2
`.bash_history1' -> `.bash_history2'
user1@vm1:~$ mv -v .bash_history1 .bash_history2
`.bash_history1' -> `.bash_history2'
user1@vm1:~$ rm -v .bash_history2
removed `.bash_history2'
user1@vm1:~$ touch .bashrc
user1@vm1:~$ ls -al
total 36
drwxr-xr-x 2 user1 user1 4096 Jun 14 12:23 .
drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
-rw------- 1 user1 user1 853 Jun 7 15:03 .bash_history
-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrc
-rw------- 1 user1 user1 45 Jun 7 13:31 .lesshst
-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile
-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak
-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1
user1@vm1:~$
user1@vm1:~$ ls .*
.bash_history .bash_logout .bashrc .lesshst .profile .profile.bak .profile.bak1
.:
ls.out
..:
user1
```
## 解釋
1. 打印你當前的工作目錄,這是你的主目錄。請注意它為何不同于`user1@vm1:~`中的`~`,這也表示,你在你的`home`目錄中。這是因為`~`是你的主目錄的縮寫。
2. 這里沒有任何東西,因為你的主目錄中只有隱藏的文件。記住,隱藏的文件是以點開頭的名稱。
3. 打印主目錄中的所有文件,因為`-a`參數讓`ls`顯示所有文件,包括隱藏文件。
4. 以長格式打印主目錄中的所有文件:權限,所有者,組,大小,時間戳(通常是修改時間)和文件名。
5. 注意文件如何按日期安排,最新的文件是最后一個。`-t`告訴`ls`按時間排序,`-r`告訴`ls`反轉排序。
6. 將`.bash_history`復制到`.bash_history1`。這似乎對你來說很神秘,但解釋真的很簡單。Bash 有一個稱為花括號擴展的功能,它有一組規則,定義了如何 處理像`{1,2,3}`之類的結構。在我們的例子中,`.bash_history{,1}` 擴展為兩個參數,即`.bash_history`和`.bash_history1`。Bash 僅僅接受花括號前的一個參數,在我們的例子中是`.bash_history`,并向參數添加花括號里的所有東西,以逗號分隔,并以此作為參數。第一個添加只是變成`.bash_history`,因為花括號中的第一個參數是空的,沒有第一個參數。接下來,Bash 添加了`1`,因為這是第二個參數,就是這樣。擴展后傳遞給`cp`的 結果參數為`-v .bash_history1 .bash_history2`。
7. 這可能對你來說很明顯。將最近創建的`.bash_history1`復制到`.bash_history2`。
8. 向`.bash_history1`移動到`.bash_history2`。請注意,它會覆蓋目標文件而不詢問,所以不再有`.bash_history2`,沒有了!
9. 將`.bashrc`時間戳更新為當前日期和時間。這意味著`.bashrc`的所有時間屬性,`st_atime`,`st_mtime`和`st_ctime`都設置為當前日期和時間。你可以通過輸入`stat .bashrc`來確定它。
0. 刪除`.bash_history2`。這里沒有警告,請小心。另外,總是用`-v`選項。
1. 再次以長格式打印所有文件。請注意`.bashrc`的時間戳更改。
2. 在你的主目錄中以短格式打印文件。請注意,你不僅可以列出`/home/user1`目錄,還可以列出`/home`目錄本身。不要和任何命令一起使用這個結構,特別是 `rm`,永遠不要!或許,你會意外地通過刪除錯誤的文件或更改權限,來使系統崩潰。
## 附加題
玩轉 bash 花括號擴展。從`echo test{1,2,foo,bar}`開始。嘗試使用花括號鍵入幾個單獨的參數。
使用 Google 搜索 bash 花括號擴展,從搜索結果中打開“Bash 參考手冊”,并閱讀相應的部分。
嘗試弄清楚`ls .*`如何和為什么工作。
對自己說10次:“我會一直使用 verbose 選項。verbose 選項通常用作`-v`參數”。
對自己說10次:“我會永遠用`ls`檢查任何危險的命令”。
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝