Ops.shell-Linux shell 筆記:命令

摘自《Linux shell 編程從入門到精通》未完待續!!!

【註釋】

#!/bin/python
print "hello world"

種類

  1. 內建命令(cd)
  2. shell函數
  3. 外部命令(find grep echo.sh)

調用過程

  • 調用POSIX系統fork函數接口,創建一個命令行shell進程的複製(子進程)
  • 在紫禁城運行環境中,查找外部命令在Linux文件系統的位置。如果外部命令給出了完全路徑,則忽略查找這一步。
  • 在子進程裏,以新程序取代shell拷貝並執行(exec),此時父進程休眠,等待子進程執行完畢
  • 子進程執行完畢後,父進程接着從終端讀取下一條命令

使用source執行shell腳本不會創建子進程,而是在父進程中直接執行。

echo 轉義字符

  • \a :報警符
  • \b :退格符
  • \c :禁止尾隨
  • \f :換頁符
  • \n :換行符
  • \r :回車符
  • \t :水平製表符
  • \v :垂直製表符
  • \\ :反斜線

常見環境變量

  • HOME 用戶的專屬目錄
  • PATH 外部命令的搜索路徑
  • COLUMNS 命令編輯模式下可使用命令行的長度
  • EDITOR 默認的行編輯器
  • VISUAL 默認的可視編輯器
  • FCEDIT 命令fc使用的編輯器
  • HISTFILE 命令歷史文件
  • HISTSIZE 保存歷史命令記錄的條數
  • HISTFILESIZE 命令歷史文件中包含的最大行數
  • IFS 定義shell使用的分隔符
  • LOGNAME 當前用戶的登錄名
  • HOSTNAME 主機名稱
  • SHELL 當前使用的shell類型
  • LANG/LANGUAGE 語言
  • MAIL 郵件存放目錄
  • MAILCHECK shell檢查MAIL文件的週期,單位秒
  • TERM 終端類型
  • TMOUT shell自動退出的時間,秒。若設爲0,則禁止shell自動退出
  • PROMPT_COMMAND 指定在主命令提示符前應執行的命令
  • PS1/PS2 PS1是基本提示符,root用戶是#,普通用戶是$。PS2是負數提示符,默認是>
  • PS3/PS4 select的命令提示符/調試命令提示符
  • MANPATH 尋找手冊頁的路徑,冒號分隔
  • LD_LIBRARY_PATH 尋找庫的路徑,冒號分隔

shell編程基礎

變量

add1=100
add2=200
echo $((add1+add2))
echo $add1
echo ${add1}
let "uninit+=5"
echo "$uninit"

【export】
export [-fnp][變量名稱] =[變量設置值]
export命令用於設置或顯示環境變量。

  • -f 代表[變量名稱]中爲函數名稱
  • -n 刪除指定的變量。變量實際上並未刪除,只是不會輸出到後續指令的執行環境中。
  • -p 列出所有的shell賦予程序的環境變量。

啓動文件

  • /etc/profile 系統範圍
  • /etc/bashrc 系統範圍,特定於bash
  • $HOME/.bash_profile 用戶環境
  • $HOME/.bashrc 用戶定義的bash初始化
  • $HOME/.bash_logout 登出(Bash)shell

【env】
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
在重建的環境中運行程序,設置環境中的每個NAME爲VALUE,並運行COMMAND

  • -i, --ignore-environment 清空所有父shell繼承來的環境變量
  • -u, --unset=NAME 從環境中刪除一個變量
env -i PATH=./:$path echo.sh

【unset】

unset [-v] variable ...
unset -f function ...

從當前shell刪除變量或函數

  • -f 刪除制定的函數
  • -v 刪除指定的變量。(默認)

傳參

testfunction(){
    echo "$# params"
    echo "$@"
}
testfunc a b c
# 3 parameters

引用參數

  • 0,1,2...,9 位置參數
  • * 以一個單字符串顯示所有參數
  • @ 從參數1開始,顯示所有參數
  • # 參數數量
  • $ 腳本運行的當前進程ID
  • ! 後臺運行的最後一個進程ID
  • ? 顯示最後命令退出狀態,0表示沒有錯誤,其他表示有錯誤
  • - 顯示shell時候用的當前選項,與set命令功能相同

【mv】

mv [option] ... Source Dest
mv [options] ... Source Directory
  • -E

    • force 文件固定範圍大小或空間保留無法保存,則操作失敗
    • ignore 忽略任何錯誤
    • warn 若無法保存則警告
  • -f 覆蓋不提示
  • -i 移動前提示

【mkdir】
mkdir [ -m Mode ] [ -p ] Directory ...

  • -m Mode 設置新創建目錄的許可位 和chmod的Mode參數一樣
  • -p 創建丟失中間路徑名稱目錄

io重定向

【cat】
cat [-q] [-r] [-s] [-S] [-u] [-n [-b]] [-v [-e] [-t]] [- | File...]

  • -b 當與-n一起指定時,省略來自空行的行號
  • -e 當與-v一起指定時,在每行末尾顯示一個$
  • -n 顯示在行號之後的輸出行,按順序從1開始編號
  • -q 如果cat命令無法找到輸入文件,則不顯示消息。該標誌等同於-q
  • -r 以一個空行來代替多個連續的空行。該標誌等同於-S
  • -s 如果cat 命令無法找到輸入問價,則不顯示消息。該標誌等同於-q標誌
  • -S 以一個空行來替代多個連續的空行。該標誌等同於-r標誌
  • -t 如果與-V一起指定,則將跳格字符顯示爲^I
  • -u 不要緩衝輸出
  • -v 將非打印字符顯示爲可視字幅
  • 當與-v一起使用時,可使用:

    • -e 將在新航之前的每行末尾
    • -t 跳格符打印成^I,換頁符打印成^L
    • - 允許cat命令的標準輸入

管道重定向

  • >改變標準輸出
echo "redirect to file." >/tmp/a.txt
  • <改變標準輸入
cat </tmp/a.txt > /tmp/.b.txt
  • >>追加文件
for line in /etc/passwd
do
    echo $line >> /tmp/b.txt
  • |建立管道
head -n10 /etc/passwd | grep "prince"

【head】
head [ -Count | -c Count | -n Number ] [ File ...]

  • -Count 從每一個要顯示的指定文件的開頭指定行數。
  • -c End 指定要顯示的字節數。
  • -n Number 指定每一個要顯示的指定文件的開頭行數。

文件描述符 - 非負整數。內核利用文件描述符訪問文件。
文件描述符表 - 用戶區的一部分,只能通過文件描述符的函數訪問。包含進程中每個打開的文件條目。
系統文件表 - 所有進程共享,每條包含文件偏移量、讀寫模式、指向它的文件描述符表的條目計數。
內存索引節點表 - 包含每個活動文件,幾個系統文件表條目可能對應同一個內存索引節點表

  • /erv/null 所有寫入它的內容會丟失,讀取則爲空
#! /bin/sh
# 自動刪除cookie,並禁止以後網站再寫入cookie
if [ -f ~/.mozilla/cookies]
then
    rm -f ~/.mozilla/cookies
fi
ln -s /dev/null ~/.mozilla/cookies
  • /dev/zero 創建交換文件
#!/bin/bash
ROOT_UID=
E_WRONG_USER=
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

if ["$UID" -ne "$ROOT_UID"]
then
    echo;echo "must be root";echo
    exit $E_WRONG_UESR
fi
blocks=${1:-$MINBLOCKS}
if ["$blocks" -lt $MINBLOCKS]
then
    blocks=$MINBLOCKS
fi
echo "Creating swap fil eof size $blocks blocks (KB)."
dd if =/dev/zeero of=$FILE bs=$BLOCKSIZE count=$blocks
mkswap $FILE $blocks
swapon $FILE
echo "Swap file created and activated"
exit $SUCCESS
  • dev/tty 輸出到此的信息只會顯示在當前工作的終端上
printf "Enter new passwd"
stty -echo
read pass < /dev/tty
printf "Enter again"
read pass2 < /dev/tty
stty echo

【read】
從標準輸入中讀取一行
read [-p] [-r] [-s] [-u [n]] [VariableName?Prompt] [VariableName ...]

  • -p 文件結束符引起該進程的清除,因此產生另外一個進程
  • -r 把一個\ 處理爲輸入行的一部分,而不是控制字符
  • -s 把輸入作爲一個命令保存在shell歷史記錄文件總
  • -u[n] 讀取一位數的文件描述符號碼n作爲輸入 n默認=0,表示鍵盤,2表示標準錯誤
  • VariableName?Prompt 指定一個變量的名稱和一個要使用的提示符
  • VariableName 指定一個或多個由空格分隔的變量名

文本檢索

【grep】
grep [-E |-F] [-i] [-h] [-s] [-v] [-w] [-x] [-y] [ [[-b][-n]] | [-c|-l|-q] ] [-p [Separator] ] {[-e PatternList ...] [-f PatternFile...]| PatternList...}[File...]

  • -b 在每行之前添加找到改行時所在的塊編號
  • -c 只顯示匹配行的計數
  • -E 每個模式視作正則
  • -ePatternList 指定一個或多個搜索模式
  • -F 每個模式視作字符串
  • -f PatternFile 指定包含搜索模式的文件 ,換行符分隔
  • -h 禁止在匹配行後附加包含此行的文件名稱
  • -i 忽略字母大小寫
  • -l 只列出包含匹配行的文件名稱
  • -n 在每一行之前放置文件中相關的行號ß
  • -p[Separator] 顯示包含匹配行的整個段落,段落之間按照Separator分隔
  • -q 禁止所有寫入到標準輸出的操作
  • -s 禁止文件不存在/不可讀寫的錯誤信息
  • -v 顯示所有與指定模式不匹配的行
  • -w 單詞搜索
  • -x 顯示與指定模式精確匹配而不含其它字符的行
  • PatternList 多個模式
  • File 文件名,默認是標準輸入

【ls】
ls [-A] [-C] [-F] [-a] [-c] [-d] [-i] [File ...]
ls -f [-C] [-d] [-i] [-m] [-s] [-x] [-l] [Directory ...]

  • -A 列出所有條目,除了.,..
  • -a 列出所有條目
  • -c 使用索引節點最近一次修改的時間,用於排序/顯示
  • -C 以多列縱向排序輸出
  • -d 僅顯示指定目錄信息
  • -F 如果是目錄,後綴'/',可執行後綴*,套接字=,FIFO|,符合鏈接@
  • -i 如果是符號鏈接,打印所連接到的文件的路徑名

變量

替換運算符

  • ${varname:-word} 如果varname存在且非空,返回varname的值,否則返回word
  • ${varname:=word} 如果varname存在且非空,返回varname的值,否則將其置爲word,返回其值
  • ${varname:?message} 如果varname存在且非空,返回varname的值,否則打印message,並退出當前腳本
  • ${varname:+word} 如果varname存在且非空,返回word,否則返回null

模式匹配運算符

  • ${varname#pattern} 刪除開頭最短,返回剩下
  • ${varname##pattern} 刪除開頭最長,返回剩下
  • ${varname%pattern} 刪除結尾最短,返回剩下
  • ${varname%%pattern}刪除結尾最長,返回剩下
  • ${varname/pattern/string} ${varname//pattern/string} 將varname中匹配模式的最長部分替換爲string
echo "the number of parameter is $# " #輸出變量的個數
echo "the return code of last command is $?" #輸出上條命令的結束值
echo "the script name is $0" #輸出命令的名字
echo "the parameters area $* " #輸出命令的所有參數
echo "\$1=$1;\$2=$2"#輸出變量,轉義字符
if [$# -ne 2]; #判斷運行參數,如果不是2,顯示用法幫助
then
    echo "Usage:$0 string file";#$0表示腳本自己
    exit 1;
fi
grep $1 $2;# 用grep在$2文件中查找$1字符串

if[$? -ne 0];#判斷前一個命令返回值
then
    echo "Not Found \"$1\" in $2";
    exit 1;
fi
echo "found \"$1\" in $2";

shift

while [ -e $1];
do
    cat $1
    Shift
done

函數

【type】
type CommandName ...
解釋指令

條件

if condition
then
    statements
[elif condition
then statements...]
[else
statements ]
fi

退出狀態值

  • 0 成功
  • >0 在重定向或單詞展開前期間(~、變量、命令、算數展開、單詞切割)失敗
  • 1~125 命令退出失敗。特定退出值的定義
  • 126 命令找到但無法執行命令文件
  • 127 命令無法找到
  • >128 命令因受到信號而死亡
exit 42

邏輯運算:&&||!

【test】
test Expression[Expression]
評估Expression參數,若表達式值爲True,返回一個零(true)退出至,否則返回非零(false)退出值,如果沒有參數也返回非零退出值。

字符串比較

  • = 匹配
  • !=不匹配
  • < 小於
  • > 大於
  • -n str1 非null
  • -z str1 null
#測試一個文件是否存在且非空
if test ! -s "$1"
then
    echo $1 does not exitst or is empty
fi

#若少於2個參數或$1文件不存在,則退出
if [ $# -lt 2 -o ! -e "$1"]
then 
    exit
fi

#判斷用戶是否存在
line=|grep $1 /etc/passwd |
if [-z line]
    echo "user $1 exists."
fi

文件屬性檢查

  • -b file 塊設備文件
  • -c file 字符設備文件
  • -d file 目錄
  • -e file 存在
  • -f file 一般文件
  • -g file 有設置它的setgid位
  • -h file 符號鏈接
  • -L file 同 -h
  • -p file 管道
  • -r file 可讀
  • -S file 套接字
  • -s file 非空
  • -u file 有設置它的setuid位
  • -w file 可寫
  • -x file 可執行,如果是目錄則可被查找
  • -O file 所有者
  • -G file 組id匹配你的id
  • file1 -nt file2 file1比file2新
  • file1 -ot file2 file1比file2舊

case

case expression in 
    pattern1)
        startements;;
    pattern2)
        statements;;
    pattern3 | pattern4)
        startements;;
case $1 in
    -f)
        ...
    -d)
        ...
esac
case $1 in
    *.jpg) gqview $1;;
    *.txt) gvim $1;;
    *.avi|*.wmv) mplayer $1;;
    *.pdf) acroread $1;;
    *) echo $1;;

循環

for name [in list]
do
    ...
done
for file in `find . -ianme "*.mp3"`
do
    mpg123 $file
done
for file in *.mp3
do
mpg123 $file
done
for name 
do
    case $name in
        -f) ...
        -d) ...
    esac
done
while condition
do
    statements
done
until condition
do
    statements...
done
#遍歷PATH路徑
path=$PATH:
while [-n $path];
do
    ls -ld ${path%%:*}
    path=${path#*:}
done
#無線循環
path=$PATH
while true
do
    if [-z $path]
    then
        break
    fi
    ls -ld ${path%%:*}
    path=${path#*:}
#跳出循環
while condition1
do ...
    while condition2
    do ...
        break2
    done
done
...
#命令行參數處理
author=false
list=false
file=""

while [$#  -gt 0]
do
    case $1 in
    -f) file=$2
        shift
        ;;
    -l) list=true
        ;;
    -a)    author=true
        ;;
    --) shift
        break
        ;;
    -*) echo $0:$1:unrecognized option
        ;;
    esac
    shift
done

【getopt】
getopt Format Tokens
分析命令標誌和參數

#getopt使用
author=false
list=false
file=""

while getopt alf: opt
do
    case $opt in
    f) file=$OPTARG
        ;;
    l) list=true
        ;;
    a) author=true
        ;;
    esac
done
shift ${{OPTIND -1}}

正則

grep

ls -l | grep '^a'
grep 'test' d*
grep 'test' aa bb cc
grep '[a-z]\{5\}' aa
grep 'w\(es\)t.*\1' aa
#後向引用
#匹配 abcdabcd,abcdeabcd,abcdfabcd
\(ab\)\(cd\)[efg]*\1\2
#匹配一行中前後出現兩個go
\(go\).*\1

文本

排序

【sort】
sort [arg] [File ...]
排序
-k [FStart [.Cstart]][Modifier] [FEnd [.CEnd]][Modifier]
[+FSkip1 [.CSkip1]][Modifier] [ -[FSkip2] [.CSkip2] [Modifier] ]

  • -A ASCII排序
  • -b 忽略前導空格和製表符,找出字段的第一或最後列
  • -c 檢查輸入的排序是否正確,否則返回非零值
  • -d 字典順序(字母數字空格)
  • -f 轉大寫
  • -I 忽略非打印字符
  • -k KeyDefinition 指定排序關鍵詞
  • -m 合併多個輸入
  • -n 按數字值排序
  • -o 輸出文件
  • -r 顛倒順序
  • -t Character 指定Charactor 爲單一的字段分隔符
  • -u 同行合併
  • -T Directory 將創建的所有臨時文件放入Directory
  • -y [Kilobytes] 指定主存儲千字節
  • -z RecordSize 防止排序行大於默認緩衝區大小出現異常種植。RecordSize必須大於等於最長行額字節值
#ASCII排序
LANG=En_YS sort fruits.txt

#字典序
sort -d fruits.txt

#忽略大小差異
sort -d -f -u fruits.txt

#字段排序
sort -t: -k3 -n /etc/group

去重

【uniq】
uniq [-c|-d|-u] [InFile [OutFile]]
去重

  • -c 顯示出現的次數
  • -d 僅顯示重複行
  • -u 僅顯示不重複的行

統計

【wc】
統計文本行數、字數、字符數

wc /etc/passwd
#l w c path
wc -l /etc/passwd
# 行
wc -w /etc/passwd
#單詞
wc -c /etc/passwd
#字符

打印

【pr】
pr [options] [files]

pr -c5 -t /tmp/linux.wiki
  • -c N N欄輸出
  • -t 不顯示標題
  • -a 行列翻轉顯示
  • -d 產生2個空格的輸出
  • -F 用一個填寫表格的字符開始新的一頁
  • -f-F
  • -h Header 用指定頭字符串作爲頁眉
  • -l Lines 設置頁長度,若小於頭尾深度,頭尾取消
  • -m 合併文件
  • -o Offset 縮進,默認0
  • -t 不顯示5行的標識頭和5行的頁腳
  • -w Width 設置行到列的寬度,適用於多個文本列的輸出

【fmt】
fmt [-cstu][-p<列起始字符串>][-w<每列字符數>][--help][--version][文件...]

  • -w<每列字符數> 每行最大字符
  • -s--split-only 只拆開數字超出每列字符數的列,但不合並字數不足的列
  • -c--crown-margin 每段前兩列縮排
  • -p<列起始字符串>-prefix=<列起始字符串> 僅合併含有指定字符串的列
  • -t--tagged-paragrapth 每列前兩列所拍,但第一列和第二列的所拍格式同
  • -u--uniform-spacing 每個字符之間都空一格,每個句子之間空2格

【fold】
fold [-b] [-a] [-w Width] [File...]
限制文本寬度

  • -w <width> 限制文本寬度
  • -b 按字節計數寬度,默認是按列。
  • -s 使得每個輸出行段儘可能寬

提取

【head】
head [-Count | -c Count | -n Number] [File...]

  • -Count 指定行數等價於-n Number
  • -c End 指定顯示的字節數
  • -n Number 指定開頭行數

字段處理

【cut】

cut -c list [file...]
cut -f list [-d delim] [file...]

剪切字節字符字段

  • -b List 指定字節位置
  • -c List 指定字符位置
  • -d Character 指定字符作爲指定-f標誌時的字段定界符
  • -f List 指定文件中設想被定界符隔開的字段的列表
  • -n 取消分隔多字節字符,僅和-b一起使用
  • -s 取消不包含定界符的行。僅和-f一起使用

【join】
join [-a FileNumber|-v FileNumber] [-e String][-o List][-t Character][-1 Field][-2 Field] File1 File2

  • -1 FieldFile1的Filed變量指定的字段來鏈接
  • -2 FieldFile2的Filed變量指定的字段來鏈接
  • -a FileNumber 以FileNumber(1|2)爲準
  • -e String用String指定的字符串來代替空輸出字段
  • -o List 構造一個輸出航來包含由List指定的字段

    • FileNumber.Field
    • 0
  • -t Character 作爲分隔符 默認空格
  • -v FileNumber 指定的文件每一行產生一個輸出行,此變量的連接字段和其他輸入文件任何一行都不匹配

文本替換

【tr】

tr [ -c| -cds|-cs|-C|-Cds|-Cs|-ds|-s] [-A] String1 String2
tr {-cd|-cs|-Cd|-Cs|-d|-s} [-A] String1
  • -A ASCII整理順序
  • -C String1值用String1的補碼替換
  • -c
  • -d 刪除包含String1指定的每個字符
  • -s 在重複字符序列中除去第一個字符以外所有的字符
#小寫轉大寫
tr 'a-z' 'A-z' <linux.wiki>linux.wiki.upper
#大括號轉爲小括號
tr '{}' '()' < textfile > newfile
#大括號轉方括號
tr '{}' '\[]' < textfile > newfile
#創建一個文件中的單詞列表
tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile
#刪除空字符
tr -d '\0' < textfile > newfile
#用單獨的換行替換每一序列的一個或多個換行
tr -s '\n' < textfile > newfile
#用“?”替換每個非打印字符
tr -o '[:print:][:cntrl:]' '[?*]' < textfile > newfile
#用單個“#”替換<space>字符類中的每個字符序列
tr -s '[:space:]' '[#*]'
cut -d ' ' -f 2,3 record.txt|sort|uniq -c|sort -r |head -n100

文件

文件
【ls】

ls [arg] [File...]
ls -f [arg] [Directory...]
  • -a 列出目錄下所有文件,包括以.開頭的文件
  • -b 把文件名中不可輸出的字符用反斜槓加字符編號的形式列出
  • -c 輸出文件的i節點的修改時間並以此排序
  • -d 將目錄像文件一樣顯示,而不是顯示其下的文件
  • -e 輸出時間的全部信息
  • -f -U 對輸出的文件不排序
  • -I 輸出文件的i節點的索引信息
  • -k 以k字節的形式表示文件的大小
  • -l 列出文件的詳細信息
  • -m 橫向輸出文件名,並以“,“作分隔符
  • -n 用數字的UID,GID代替名稱。
  • -o 顯示文件除組信息外的詳細信息
  • -p -F 在每個文件名後附上一個字符,以說明該文件的類型,”*“表示可執行的普通文件;“/”表示目錄”@“表示符號鏈接;”|“表示FIFOs;"="表示套接字(sockets)
  • -q 用?代替不可輸出的字符
  • -r 對目錄反向排序
  • -s 在每個文件名後輸出該文件大小
  • -t 以時間排序
  • -u 以文件上次被訪問的時間排序
  • -x 按列輸出,橫向排序
  • -A 顯示除”.”和“..”以外的所有文件
  • -B 不輸出以“~”結尾的備份文件
  • -C 按列輸出,縱向排序
  • -G 輸出文件的組信息
  • -L 列出鏈接文件名而不是鏈接到的文件
  • -N 不限制文件長度
  • -Q 把輸出的文件名用雙引號括起來
  • -R 列出所有子目錄下的文件
  • -S 以文件大小排序
  • -X 以文件的擴展名(最後一個.後的字符)排序
  • -1 一行只輸出已給文件
  • --color=no 不顯示彩色文件名

文件類型

  • - 普通文件
  • d 文件夾
  • b 塊設備文件
  • c 字符設備文件
  • l 軟連接文件
  • s 套接字文件

文件的權限

  • OWNER 所有者
  • GROUP 用戶組
  • OTHER 其他用戶
  • r 4
  • w 2
  • x 1
  • - 0

【chown】

chown [-f] [-h] [-R] Owner [:Group] {File...|Directory...}
chown -R [-f] [-H|-L|-P] Owner {:Group] (File...|Directory...} 
  • -f 禁止除用法消息之外的所有錯誤消息
  • -h 更改遇到的符號鏈接的所有權,而非符號鏈接指向文件或目錄的所有權
  • -H 如果指定了-R,?
  • -L 如果指定了-R,?
  • -P 如果指定了-R,?
  • -R 遞歸地降序目錄

【chgrp】

chgrp [-f] [-h] [-R] Group {File...|Directory...}
chgrp -R [-f] [-H|-L|-P] Group {File...|Directory...}
  • -f 消除用法消息以外的所有錯誤消息
  • -h 更改遇到的符號鏈接的組所有權,而非通過符號鏈接所指向的文件或目錄的組所有權
  • -H 如果指定了-R,?
  • -L 如果指定了-R,?
  • -P 如果指定了-R,?
  • -R 遞歸降序目錄

【chmod】

chmod [-R][-h][-f][[u][g][o]|[a]] {{-|+|=}[r][w][x][X][s][t]}{File...|Directory...}
  • -f 禁止所有錯誤報告
  • -h 禁止遇到的符號鏈接指向的文件或目錄的方式更改
  • -R 遞歸

【touch】

touch [-a][-c][-m][-f][-r RefFile][Time|-t Time]{File...|Directory...}

--a 更改File指定文件的訪問時間
--c 如果文件不存在,則不要進行創建
--f 嘗試強制touch運行,而不管文件的讀寫權限
--m 更改File的修改時間
--r RefFile 使用由RefFile變量指定的文件的相對應時間
Time MMDDhhmm[YY]

  • -t Time [[CC]YY]MMDDhhmm[.SS]

尋找

【find】

find pathname -options [-print -exec -ok...]
  • pathname 路徑
  • -print 輸出到標準輸出
  • -exec 執行該參數所給出的shell命令
  • -ok 和exec相同,更爲安全的模式
  • -name 按照文件名查找文件
  • -perm 按照文件權限來查找文件
  • -prune 不在當前指定的目錄中查找
  • -user 按照文件屬主來查找文件
  • -group 按照文件所屬的組來查找文件
  • -mtime -n +n 按照文件的更改時間來查找文件 -n表示文件更改時間距現在n天以內+n表示文件更改時間距現在n天以前。find命令還有-atime和-ctime選項,但他們都和-mtime選項類似
  • -nogroup 查找無有效所屬組的文件
  • -nouser 查找無有效屬主的文件
  • newer file1 ! file2 查找更改時間表文件file1新,但比文件file2舊的文件
  • -type 查找某一類型的文件
  • -size n:[c]查找文件長度爲n塊的文件
  • -depth 首先查找當前目錄中的文件,再在其子目錄中查找
  • -fstype 查找位於某一類型文件系統中的文件
  • -mount 不跨越文件系統mount點
  • -follow 如果find命令遇到符號鏈接文件
  • -cpio 對匹配的文件使用cpio命令

比較

【comm】

  • -1 不顯示只在第1個文件裏出現過的列
  • -2 不顯示只在第2個文件裏出現過的列
  • -3 不顯示只在第1個和第2個文件裏出現過的列

【diff】

#比較2個文件的內容
diff [-c|-C Lines|-D[String]|-e|-f|-n][-b][-i][-t] File1 File2
diff [-h][-b] File1 File2
#排序字典的內容並比較不同的文件
diff [-c|-C Lines|-e|-f|-n] [-b] [-i] [-l] [-r] [-s] [-S File] [-t] [-w] Directory1 Directory2
diff [-h][-b] Directory1 Directory2

--clines 啓動diff命令,但只比較lines變量指定的行數。
--c 比較3行上下文
--d [string] 使得diff命令在標準輸出上建立一個file1和file2的合併版本,包含了c預處理器控件,以便沒有定義string的結果編譯等同於編譯file1,同時定義string產生file2
--e 以適合ed編輯器的格式進行輸出,將file1轉換成file2。
--f 以不適合ed編輯器的格式創建輸出,按照在-e標誌下產生的逆向順序顯示從fikle1到file2轉換的必要修改。
--h 如果要更改的部分比較短,而且分隔清晰
--i 忽略大小寫
--l翅膀輸出格式
--n 產生類似-e的輸出,但順序相反,而且在每一插入或刪除命令上進行更改計數
--r 使diff命令的應用程序遞歸到遇到公共子目錄
--s 報告相同的文件,否則不提
--s[file] 當比較目錄時,忽略在file變量指定的文件之前整理名稱的文件
--t 在輸出行擴展製表符
--w 忽略所有空格和製表符

vimdiff file1 file2

文件系統

ext2:早期使用的,支持undelete,大文件
ext3:用於linux的日誌文件系統,支持大文件,不支持undelete
reiserfs:都支持

/bin 引導啓動所需的命令或普通用戶可能用的命令
/sbin 類似/bin,但不給普通用戶使用,雖然如果必須要且允許時可以使用
/etc 特定機器的配置文件
/root root用戶的家目錄
/lib 根文件系統上的程序所需的共享庫
/lib/modules 核心可加載模塊
/dev 設備文件
/tmp 臨時文件
/boot 引導加載器使用的文件
/mnt 系統管理員臨時mount的安裝點
/proc,/usr,/home 其他文件系統的安裝點

/etc/rcor,/etc/rc.dor,/etc/rc*.d 啓動或改變運行級時運行的scripts
/etc/passwd 用戶數據庫
/etc/fdprm 軟盤參數表,同setdfprm設置
/etc/fstab 啓動時mount -a 命令自動mount的文件系統列表
/etc/group
/etc/inittab init的配置文件
/etc/issue getty在登錄提示符前的輸出信息
/etc/magic file的配置文件
/etc/motd 成功登錄後自動退出,用於通告信息,如計劃關機時間的警告
/etc/mtab 當前安裝的文件系統列表
/etc/shadow 影子口令軟件的口令文件
/etc/login.defs login命令的配置文件
/etc/printcap 打印機
/etc/proflie,/etc/csh.login,/etc/csh.cshrc 登錄或啓動時只需的文件
/etc/securetty 確認安全終端
/etc/shells 可信任的shell
/etc/termcap 終端性能數據庫

/dev 誰被文件
/usr/X11R6 Xwindow系統的所有文件
/usr/X386 X11Release5的
/usr/bin 用戶命令
/usr/ 根文件系統不必要的系統管理命令
/usr/man,/usr/info,/usr/doc 手冊頁、GNU信息文檔等
/usr/include c頭文件
/usr/lib 程序或子系統不變的數據文件
/usr/local 本地安裝的軟件和其他文件

/var/catman 要求格式化時man的cache
/var/lib 系統正常運行時要改變的文件
/var/local 安裝的程序的可變數據
/var/lock 鎖定文件
/var/log 各種程序的log
/var/run 保存到下次引導前有效的系統信息文件
/var/spool mails,news,打印隊列和其他隊列工作的目錄
/var/tmp 比/tmp允許的大或需要存在較長時間的臨時文件

/proc是一個假的文件系統,由核心在內存中產生,提供系統信息

【mkfs】
mkfs [-b Boot] [-l Label] [-i i-Nodes] [-o Options] [-p Prototype] [-s Size] [-v VolumeLabel] [-V VfsName] Device
在一個指定的設備上製作一個新的文件系統:初始化卷標,文件系統卷標和啓動塊

-b Boot 命名要在新文件系統的塊0安裝的程序
-i i-Nodes 指定文件系統上i-nodes的初始數量
-l Label 文件系統標號
-o Options 指定用逗號分隔的虛擬文件系統

mount
mount [-f] [-n Node] [-o Options] [-p] [-r] [-v VfsName] [-t Type| [Device|Node:Directory] Directory|all|-a][-V[generic_options] special_mount_points

使文件系統可用

-a 包含true安裝屬性的節
-f 在系統初始化時請求強制安裝
-n node指定保留安裝目錄的遠程節點

流編輯

sed

awk

進程

工具

ssh
screen
vim

日誌清理程序

系統監控程序

《linux shell編程從入門到精通》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章