有時候我剛跑完一個指令,馬上發現其實只需要改其中一小部分。
例如我剛用 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,累積起來真的會讓工作順很多。
Top comments (0)