請問unix shell裡面的指令,如何寫一個程式取代mv

這是我們老師出的原文題目

Write a program called mv (which replaces the UNIX command mv) that tries to rename the specified file (using the UNIX command mv), but if the destination file exist, instead creates an index number - a sort of version number - to append to the destination file.

小弟我剛開始學unix, 對於撰寫shell scripts 不太熟悉..不知道這提如

何下手..題目的意思大概是寫一個程式,程式的名稱叫做mv然後要取

代原本unix的mv指令,假設下一個指令 # mv abc abcd 把abc這個檔案

名稱改成abcd如果abcd這個檔案已經存在就自動命名為abcd01或不

同檔名,都可以,就是不要覆蓋掉原來的檔案,請問可以提供類似的範

例程式嗎? 這禮拜四就要demo了 ><" 感謝各位大大相助 ..

已更新項目:

請問一下喔 是把程式碼寫在 vi mv <<這裡面就可以嗎??

怎麼我下mv更改檔名 原先有的就被覆蓋掉了@@"

麻煩大大講解一下步驟...感謝摟 ^___^

2 個已更新項目:

回覆蚯蚓大大:

改成實做的話我是修改 >vi .bash_profile 裡面的程式碼

加了一條alias mv = '程式所在路徑'

這樣就可以取代原本的mv了

參考資料: 鳥哥的私房菜

http://linux.vbird.org/

2 個解答

評分
  • Chiu
    Lv 4
    1 0 年前
    最佳解答

    Unix mv 做的事情可多了, man mv 便知.

    題目這樣出可能只是要取代 "rename file" 的功能而已.

    (因為如果是目錄的操作, 那後面說的 append 就無法實作)

    vi mv

    ===

    #!/bin/sh

    mv=/bin/mv

    rm=/bin/rm

    cat=/bin/cat

    if [ $# -ne 2 ]; then

    echo Usage: $0 src dst

    echo rename src to dst

    echo "若 dst 存在, $0 會產生 .01 結尾的檔案,"

    echo "並且將 src 的內容新增到 dst."

    exit 0

    fi

    src=$1

    dst=$2

    if [ -f $src ]; then

    if [ -d $dst ]; then

    echo "can't rename a file to dir"

    exit -1

    elif [ -f $dst ]; then

    fname=$dst.01

    while [ -f $fname ]; do

    fname=$fname.01

    done

    echo $cat $src $dst \>$fname

    echo $rm $src

    # 真正執行: $cat $src $dst > $fname

    # $rm $src

    echo rename $src to $fname ok!

    exit 0

    else

    # dst not exists

    echo $mv $src $dst

    # 真正執行去掉 echo

    echo rename $src to $dst ok!

    exit 0

    fi

    else

    echo "No such file $src"

    exit -1

    fi

    # 記得 chmod 755 mv

    範例:

    $ls -1 a b*

    a

    b

    bt

    bt.01

    bt.01.01

    $./mv

    Usage: ./mv src dst

    rename src to dst

    若 dst 存在, ./mv 會產生 .01 結尾的檔案,

    並且將 src 的內容新增到 dst.

    $./mv a c

    /bin/mv a c

    rename a to c ok!

    $./mv a b

    /bin/cat a b >b.01

    /bin/rm a

    rename a to b.01 ok!

    $./mv a bt

    /bin/cat a bt >bt.01.01.01

    /bin/rm a

    rename a to bt.01.01.01 ok!

    2006-12-27 21:06:12 補充:

    echo $cat $src $dst >$fname

    這一行的 > 後面還有一個 倒斜線 (backslash) (在這裡不知道怎麼打出來)

    2006-12-27 21:07:39 補充:

    抱歉是放在前面才對 因為要 escape 掉 > 輸出轉向

    參考資料: 自己
  • 匿名使用者
    1 0 年前

    用 Korn Shell Script 寫的,

    程式如下:

    #!/usr/bin/ksh

    if [[ $# -ne 2 ]] ; then

    echo "Usage: $0 SourceFile TargetFile"

    echo "\\tRename SourceFile to TargetFile"

    exit 1

    else

    sfile=$1

    dfile=$2

    fi

    if [[ ! -f $sfile ]] ; then

    echo "$sfile does not exist !"

    exit 1

    fi

    if [[ -f $dfile ]]; then

    num=0

    for f in $dfile*([0-9]); do

    n=${f#$dfile}

    if [[ $n -gt $num ]] ; then

    num=$n

    fi

    done

    let num+\+

    if [[ ${#num} -lt 2 ]] ; then

    num=0$num

    fi

    mv $dfile $dfile$num

    fi

    mv $sfile $dfile

    2006-12-27 15:28:30 補充:

    因為你的題目說要用原本的 mv ,

    所以有二種方式處理,

    一、是存成 mv.ksh ,然後用 chmod a\ x mv.ksh 變更為全部人都可以執行。

    二、如果一定要存成 mv 的話,

    一樣要變更權限,用 chmod a\ x mv,

    但是程式碼中的 mv 要改為 /usr/bin/mv ,(應該是在這路徑)

    這樣子才能呼叫到原本的 mv。

    2006-12-27 15:30:29 補充:

    chmod a+x 的+會被系統吃掉

    剩下

    chmod a\ x

    2006-12-27 15:36:09 補充:

    如果你的路徑沒有包含現在目錄的話,

    要下 . mv 才算是執行這個 shell script,

    否則,會執行到原本路徑中的 mv。

    檢查路徑是不是有包含現在目錄,

    只要下 echo $PATH,

    目錄都是以分號做分隔字元,

    如果沒有看到 "." ,

    就代表執行命令時,

    不會搜尋現在的目錄。

    2006-12-28 10:07:12 補充:

    執行範例:

    tmp>ls -l bb* #檢查 bb* 存不存在

    ls: cannot access bb*: No such file or directory

    tmp>echo test > aa #建立新檔 aa

    tmp>echo test > bb #建立新檔 bb

    tmp>mv.ksh aa bb #第一次使用自訂的 mv,由於 bb 已存在,將會把原本的 bb 更名為 bb01

    2006-12-28 10:07:35 補充:

    tmp>echo test > aa #建立新檔 aa

    tmp>mv.ksh aa bb #第二次使用自訂的 mv,由於 bb 已存在,將會把原本的 bb 更名為 bb02

    tmp>echo test > aa #建立新檔 aa

    tmp>mv.ksh aa bb #第三次使用自訂的 mv,由於 bb 已存在,將會把原本的 bb 更名為 bb03

    tmp>ls -l bb*

    2006-12-28 10:07:46 補充:

    -rw-r--r-- 1 Eric None 5 Dec 28 01:57 bb

    -rw-r--r-- 1 Eric None 5 Dec 28 01:56 bb01

    -rw-r--r-- 1 Eric None 5 Dec 28 01:56 bb02

    -rw-r--r-- 1 Eric None 5 Dec 28 01:57 bb03

    tmp>

還有問題?馬上發問,尋求解答。