Shell指令碼第四篇 001# 檔案校正002md5sum filename003 004# 按數組排序005sort -n filename.txt006 007# 按逆序排序008sort -r file.txt009 010# 按月份排序011 012sort -M file.txt 013 014# 按月份排序( 按照一月,二月,三月,這樣的順序排序 )015 016# 判斷一個檔案是否已經排序017#!bin/bash018# filename019sort -C file;020if [ $? -eq 0 ]; then021 echo sored022else023 echo unsored024fi025 026#如果要合并兩個排序過的檔案027sort -m sorted1 sorted2028 029cat data.txt0301 mac 20000312 winxp 40000323 bsd 10000334 linux 1000034#有很多方法對這段文本排序035 036#執行用哪一列進行排序037 038sort -nrk 1 data.txt 039winxp 4000040mac 2000041linux 1000042bsd 1000043 044# 依據第一列,以逆序形式排序045 046#衣服第二列進行排序047sork -k 2 data.txt048 049bsd 1000050linux 1000051mac 2000052winxp 4000053 054# uniq 去重複字元055 056cat uniq .txt | uniq057 058cat uniq.txt | uniq -u # 只顯示未重複過的字串059 060cat uniq.txt | uniq -c #為了統計各行在檔案中出現的次數061 062cat uniq.txt | uniq -d #找出檔案中重複的行063 064cat data.txt065u:01:gnu066d:04:linux067u:01:bash068u:01:back069# 我們需要 01, 04 中間的字串作為唯一的鍵盤,可以通過忽略前2個字元(-s 2) 並使用-w 選項(-w 2) 指定用於比較的最大字元數的方式來選定該鍵070 071sort data.txt | uniq -s 2 -w 2072 073 074uniq -z file.txt # 用uniq 命令產生包含0值位元組的終止字元的輸出075 076uniq -z file.txt | xargs -0 rm # 刪除所有指定的檔案,如果某個檔案出現多次,uniq命令只會將這個檔案寫入stdout一次077 078# 臨時檔案名稱079temp_file = "/tmp/var.$$"080echo $temp_file;081# .$$作為添加的尾碼會被擴充成當前指令碼的進程ID082 083# 產生臨時測試檔案084dd if=/dev/zero bs=100k count=1 of=data.file085 086#分割檔案087split -b 10k data.file088 089#分割檔案添加首碼名090split -b 10k data.file -d -a 4 split_file091 092#如果不想預設按照資料區塊還切割093split -l 10 data.file 094# 分割成多個檔案,每個檔案10行095 096# 提取副檔名必須藉助%097file_jpg = "sample.jpg"098name=${file_jpg%.*}099echo File name Is $name;100# ${VAR %.*} 的含義是,刪除%右側的萬用字元,非貪婪模式101# ${VAR%%.*} 從右向左執行貪婪模式比對102 103# 藉助#操作符號,可以提取檔案名稱中的.jpg104jpg=${file_jpg#.*}105echo $jpg106# ${VAR#.*} 是從$VAR中刪除位元於#右側的萬用字元,萬用字元從左向右進行匹配107# ${VAR##*.} 貪婪模式108 109# 實現批量重新命名shell指令碼110 111#!/bin/bash112#filename rename113#初始設定變數114count=1115#迴圈所有檔案夾內的jpg檔案116for img in *.jpg117 do118 # 產生新檔案名稱119 new=image-$count.${img##*.}120 #移動檔案 2> /dev/null 標準錯誤指向空,防止列印到終端121 mv "$img" "$new" 2> /dev/null122 # 如果萬用字元*.jpg 沒有匹配到人和影像檔,那麼shell會將萬用字元接是為字串。從上面的輸出可以看到不存在的.jpg檔案,因此123 # 如果 mv *.jpg image-x.jpg 肯定會產生錯誤,if ( $? -eq ] 檢查退出狀態($?) 如果最近執行的命令沒有錯誤,那麼$?的值是0,否則124 # 會返回非零值,當mv命令出錯時也會返回非0值,防止產生 Renameing file 為空白,計數也相加125 if [ $? -eq 0 ];126 then127 echo "Renameing $img to $new"128 let count++129 fi130done131 132將*.JPG 更名衛*.jpg133rename *.JPG *.jpg134 135將檔案名稱中的空格替換為_136rename 's/ /_/g' *137# 's/ /_/g' 用於替換檔案名稱, 而* 用於匹配檔案名稱的萬用字元138 139檔案名稱轉換大小寫140rename 'y/A-Z/a-z/' *141rename 'y/a-z/A-Z/ *142 143為了將mp3檔案轉移定的目錄,可以使用144find path -type f -name "*.mpe" -exec mv {} target_dir \;145 146將所有的檔案名稱中的空格替換為字元_147find path -type f -exec rename '/s /_/g' {} \/;