1. 程式人生 > 實用技巧 >三 、 檔案增刪改查

三 、 檔案增刪改查

複製檔案和資料夾

cp copy 預設情況下是別名,原來本身命令是不提示覆蓋的

Usage: cp [OPTION]... [-T] SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
or: cp [OPTION]... -t DIRECTORY SOURCE...
-i 顯示提示資訊
-n 不覆蓋
-r -R 遞迴複製
-d 只複製連結檔案,不復制原始檔
-a 歸檔
-v 顯示過程
-b 備份原來的檔案
--backup=number 備份檔案加上數字
-p 保留原來的屬性
  • 如果原始檔是檔案的話

    • 目標是檔案

      • 目標檔案如果不存在的話,則新建目標檔案,並把內容寫到目標檔案中

      • 如果目標檔案存在的話,本來的命令是直接覆蓋,建議使用-i來提示使用者

    • 目標是資料夾

      • 在資料夾中新建一個同名的檔案,並把檔案內容寫到新檔案中

  • 如果原始檔為多個檔案的話

    • 目標必須是資料夾,資料夾必須存在,其他情況都會報錯

  • 如果原始檔是資料夾的話

    • 目標檔案是檔案: 不可以

    • 目標檔案必須是資料夾,必須使用-r選項

    • 如果目標檔案不存在:則直接建立目標資料夾,並把原始檔夾的資料都複製到目標資料夾

    • 如果目標檔案存在:

      • 如果是檔案的話,則報錯

      • 如果是資料夾:則在目標資料夾中建立同名資料夾,並把所有資料都複製到新資料夾

移動、重新命名

mv move

Usage: mv [OPTION]... [-T] SOURCE DEST
or: mv [OPTION]... SOURCE... DIRECTORY
or: mv [OPTION]... -t DIRECTORY SOURCE...
-i 提示
-f 強制
-b 備份
--backup=number 備份後面加數字
-v 顯示過程

刪除

rm remove

Usage: rm [OPTION]... FILE...
-i 提示
-r -R 遞迴刪除
-f 強制刪除
rm -rf 慎用
rm -rf /*
cd /
rm -rf *

連結

軟連結

  • 相當於windows的快捷方式

  • 建立命令 ln -s 原始檔 目標檔案

  • 可以對目錄做軟連結

  • 指向另外的一個檔案或者目錄的路徑,大小是路徑的長度的字元

  • 對磁碟引用次數沒有影響

  • 可以跨分割槽

  • 原始檔發生改變,軟連結會跟著發生變化

  • 原始檔刪除,軟連結不能訪問

硬連結

  • 磁碟引用次數會發生變化

  • 指向的是硬碟上的同一塊區域

  • 磁碟的引用數會隨著硬連結次數來增加

  • 不能對目錄做硬連結

  • 不能跨越分割槽

  • 原始檔發生改變,硬連結也會跟著變化

  • 原始檔刪除以後,硬連結可以訪問

檢視檔案型別

file

輸入和輸出

  • 標準輸入 預設是來自鍵盤的輸入 stdin 0

  • 標準輸出 預設輸出到終端視窗 stdout 1

  • 標準錯誤輸出 預設輸出到終端視窗 stderr 2

I/O重定向

> 覆蓋

  • > 將標準輸出重定向到檔案中

  • 2> 將錯誤輸出重定向到檔案中

  • &> 將所有的輸出都重定向到檔案中

禁止、允許覆蓋

  • 禁止覆蓋 set -C

  • 允許覆蓋 set +C

>> 追加

>> 將標準輸出追加到檔案中

2>> 將錯誤輸出追加到檔案中

&>> 將所有輸出追加到檔案中

標準輸入和錯誤輸入分開儲存

[root@localhost ~]#ls f 45yuio > log.log 2> error.log
[root@localhost ~]#cat log.log
f
[root@localhost ~]#cat error.log
ls: cannot access 45yuio: No such file or directory

合併所有的輸出

  • &> 覆蓋重定向

  • &>> 追加重定向

  • command > file 2>&1

  • command >> file 2>&1

  • ():合併多個檔案的輸出

  • /dev/null 黑洞

從檔案匯入stdin

tr 字元替換

-t 截斷
-d 刪除
-s 壓縮,去重
-c 取反
[root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue
\S
KERNEL \R ON AN \M
[root@localhost ~]#tr 'a-z' 'A-Z'
qwertyy
QWERTYY
12345678
12345678
ASDFGHJ
ASDFGHJ
qwertyuio
QWERTYUIO
^C
[root@localhost ~]#tr ab 12
ab
12
abb
122
asdfghjkl
1sdfghjkl
^C
[root@localhost ~]#tr abc 12
ab
12
abc
122
abc
122
^C
[root@localhost ~]#tr ab 123
ab
12
abb
122
avc
1vc
qbc
q2c
abc
12c
[root@localhost ~]#tr -t abc 12
abc
12c
ab
12
[root@localhost ~]#tr -d abc
qwertyui
qwertyui
an^H^H
n

abc

artyibrtyuiocrtyuiop
rtyirtyuiortyuiop
^C
[root@localhost ~]#tr -d abc < /etc/issue
\S
Kernel \r on n \m

[root@localhost ~]#cat /etc/issue
\S
Kernel \r on an \m
[root@localhost ~]#tr -s a
abc
abc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
abc
^C
[root@localhost ~]#tr -sc a
aasdaaaaaaa
aasdaaaaaaa
^[[A^H^H^C
[root@localhost ~]#tr -sc a
aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd
aaaaaaaaabcd
[root@localhost ~]#tr -dc a
aaaaaaaaaaaabbbbbbbbbb
asdfghjkqwertyuiozxcvbnmxcvbnm,.
aaaaaaaaaaaaa
ctrl+d 結束
[root@localhost ~]#tr -dc "a\n"
asdfghjk
a
wertyujk;l'



asdfghj
a
[root@localhost test]#tr -d a < issue > issue 處理完成以後不能寫會到原始檔,要寫到新的檔案中
[root@localhost test]#seq 1 10 > b
[root@localhost test]#cat b
1
2
3
4
5
6
7
8
9
10
[root@localhost test]#tr -d "\n" < b
12345678910[root@localhost test]#tr -d "\n" < b
[root@localhost test]#tr "\n" " " <b
1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr "\n" " " <b >c
[root@localhost test]#cat c
1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "\n" <c
1
2
3
4
5
6
7
8
9
10

多行傳送給stdin

# 第一種方式
[root@localhost test]#cat > f1
qwert
wertyui
wertyui
wertyuiopasdfghjk
sdfghjkl
sdfyhjkl;sdfghjkl;xcvb

# 第二種方式
[root@localhost test]#cat > f2 <<EOF
> qwerty
> qwertyu
> wertyui
> qwertyu
> EOF
EOF 不是必須得,只要兩個相同就可以

管道

管道使用“|”來表示

命令1|命令2|命令3

  • 把命令1的輸出結果當做命令2的輸出結果,把命令2的輸出結果當成命令3的輸入結果

  • 預設情況下,管道只能傳送標準輸出

  • 如果需要把錯誤輸出也傳遞,則需要|&

  • 一般用來組合多個命令

  • 有一些命令是不接受管道的

[root@localhost test]#ls f1|tr 'a-z' 'A-Z'
F1
[root@localhost test]#ls f
ls: cannot access f: No such file or directory
[root@localhost test]#ls f|tr 'a-z' 'A-Z'
ls: cannot access f: No such file or directory
[root@localhost test]#ls f|&tr 'a-z' 'A-Z'
LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
[root@localhost test]#echo file{1..20}|touch
touch: missing file operand
Try 'touch --help' for more information.