一個很小但很好用的 zsh 技巧:修改上一個指令

有時候我剛跑完一個指令,馬上發現其實只需要改其中一小部分。

例如我剛用 ffmpeg 轉了一個影片:

ffmpeg -i calligraphy01.mp4 -c:v libx264 -c:a aac calligraphy_good_01.mp4

然後我想用同樣的指令處理下一個檔案:

ffmpeg -i calligraphy02.mp4 -c:v libx264 -c:a aac calligraphy_good_02.mp4

如果用傳統方法,我可能會按上箭頭,然後手動把兩個地方的 01 改成 02

但在 zsh 裡,可以直接輸入:

!!:gs/01/02/

意思是:

拿上一個指令,把所有的 01 都換成 02,然後執行。

所以這個:

!!:gs/01/02/

會展開成:

ffmpeg -i calligraphy02.mp4 -c:v libx264 -c:a aac calligraphy_good_02.mp4

語法是什麼意思?

!!

代表「上一個指令」。

:gs/01/02/

代表「把所有 01 全部替換成 02」。

所以完整的:

!!:gs/01/02/

意思就是:

使用上一個指令,把所有 01 改成 02,然後執行。

先預覽,不要馬上執行

有時候我不想讓它立刻執行,尤其是指令比較長、比較重要,或者執行成本比較高的時候。

這時可以加上 :p

!!:gs/01/02/:p

它會只印出修改後的指令,不會執行:

ffmpeg -i calligraphy02.mp4 -c:v libx264 -c:a aac calligraphy_good_02.mp4

如果看起來沒問題,就按一下 上箭頭,把剛剛印出的指令帶回命令列,再檢查一次,然後按 Enter 執行。

比較安全的流程就是:

!!:gs/01/02/:p

確認輸出結果後:

上箭頭 → 再看一次 → Enter

這對比較長、比較容易打錯、或不想立刻執行的指令很有用。

只替換第一個地方

如果你只想替換第一個出現的地方,也可以用:

^01^02

不過像上面的 ffmpeg 例子,輸入檔名和輸出檔名裡都有 01,所以通常會比較適合用:

!!:gs/01/02/

這種小技巧每次可能只省幾秒鐘,但如果你常常在 command line 裡重複處理檔案、日期、編號、影片、圖片或 migration,累積起來真的會讓工作順很多。

Total
0
Shares
Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Post

Anthropic’s safety warnings may have just backfired — the government has pulled the plug on its most powerful AI

Related Posts