Linux與命令列基礎
$ ls
a.log b.log notes.txt
$ for f in *.log; do mv "$f" "${f%.log}.txt"; done上面的操作之後,目錄中的檔案是下列何者?
- Aa.log.txt、b.log.txt、notes.txt
- B仍是 a.log、b.log、notes.txt,但 a.log 與 b.log 內容中的「.log」字串被取代為「.txt」
- Ca.txt、b.txt、notes.txt
查看答案與解析
正確答案:C. a.txt、b.txt、notes.txt
for f in *.log 會把符合 *.log 的 a.log 與 b.log 逐一放入變數 f,重複執行 do 與 done 之間的部分。${f%.log} 是從 f 的值的末尾去掉 .log 後的字串,a.log 就成為 a,mv "$f" "${f%.log}.txt" 會把 a.log 重新命名為 a.txt。notes.txt 不符合 *.log,所以維持原樣。把 "$f" 用雙引號括起來,是為了即使名稱含有空白,也能當作一個引數傳給 mv。
- A. 這是寫成 mv "$f" "$f.txt" 時的結果。${f%.log} 會去掉末尾的 .log。
- B. mv 是變更檔案名稱的指令,不會改變內容。取代內容要用 sed 等工具。
- C. 正確。名稱變成去掉末尾的 .log 再加上 .txt。