回覆列表
  • 1 # 產品經理老胡

    Linux下批次重新命名檔案操作起來效率非常高,幾個命令就能夠搞定,經理我還是老套路,先把問題分解:

    讀取使用檔案列表

    解析檔案列表的資訊,重新命名檔案

    所以能夠看出來讀取並且解析檔案列表是比較核心關鍵的。

    讀取解析檔案列表

    不知道題主說的用來重新命名檔案列表的檔案大致是什麼樣子,那我就舉一個相對常見的例子吧,來看這個用作重新命名的filelist檔案內容:

    日照香爐生紫煙.txt 遙看瀑布掛前川.txt

    舉頭望明月.txt 低頭思故鄉.txt

    桃花潭水深千尺.txt 不及汪倫送我情.txt

    第一列是原始檔名,第二列是目標檔名。也就是說要將第一列的檔名重新命名為第二列的檔名。看到這樣的分列,馬上我們就想到了awk命令。現在這個問題就轉換成了這樣一個流程:

    先用cat讀入檔案內容,再使用awk將每一行的分列中的內容分別取出,最後需要將取出的域變成mv命令的兩個引數。

    我們先做解析檔案:

    cat filelist | awk -F" " "{print $1;print $2}"

    -F引數和後面的空格字元指定了域分隔符為空格,然後輸出兩個域的內容,用分號分隔開是為了作為兩個字串輸出(←這裡是重點)。

    解析檔案列表的資訊,重新命名檔案

    在這裡我們需要將上一節設計的命令的輸出結果作為引數傳遞給mv語句來實現重新命名。這裡用到的命令是xargs。xargs可以接收管道傳遞過來的字串作為引數給後面的命令使用,比如:

    echo "man.txt" | xargs -I{} mv {} ager.txt

    這一句的意思就是將

    man.txt

    作為後面mv的第一個引數,透過xargs傳遞給mv。xargs的-I引數指定後面的花括號{}作為引數的佔位符,等同於傳遞過來的引數。

    我們要實現的效果稍微複雜一點,因為我們的mv需要兩個引數,要用到xargs的-n2引數來指定傳遞引數的個數為2。所以我們需要的語句的最終形式是這樣的:

    cat filelist | awk -F" " "{print $1;print $2}"|xargs -n2 mv

    看一下效果:

    完美解決問題。

    總結一下,批次重新命名還有其它的辦法(我知道你又要說用while迴圈),但是我覺得這個應該是比較方便的了。原始檔和目標檔案的名字稍微處理一下,按照這種格式儲存成為文字文件,一串命令就搞定。

    關於像這樣的批次重新命名的操作,很多類似“運維面試100題”之類的文章裡可能都有涉及,但是語焉不詳,命令生澀難記。學習Linux最好的辦法就是自己實際操作一下,更好的辦法就是關注經理,每天看經理的悟空問答,每天都有這類小操作的詳細解答。一天學一點,100天之後就會發現一個不同的自己。

  • 中秋節和大豐收的關聯?
  • 策劃透露李白將要進行調整,刺客一哥地位恐遭威脅,對此你怎麼看?