使用正則表達式重命名文件
我在 Linux 機器上的文件夾中有許多文件,名稱如下:
11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35
我想使用正則表達式來重命名 .inp 副檔名
我試過了
mv * *.inp mv: target '*.inp' is not a directory
這提供了一個錯誤。我也嘗試使用正則表達式
$$ 123 $$$$ 12345 $$而不是 *. 所以,我知道 mv 用於移動文件。我也有這樣的想法,也許我可以
./*.inp
用來強制 mv 在同一個文件夾中寫入,但它失敗了。所以,除了沒有正確理解它的mv
工作原理之外,我將如何繼續完成這項工作mv
?
您的命令的問題是該
mv
命令只能移動/重命名單個文件(當恰好給出兩個命令行參數時),或將一堆文件移動到單個目標目錄(超過兩個命令行參數)。在您的情況下,您使用擴展
* *.inp
作為參數,這將擴展為目前目錄中的所有可見文件名,然後是匹配的名稱*.inp
。假設這擴展到兩個以上的名稱,那麼最後一個參數需要是目錄的名稱才能使命令成為有效mv
命令,否則您將收到“不是目錄”錯誤。在這種情況下,我們希望
mv
一次使用兩個參數,為此我們需要使用 shell 循環:for name in [123][1-5]; do mv "$name" "$name.inp" done
這將遍歷與您提到的文件名通配模式匹配(變體)的所有名稱(注意,這不是正則表達式)。在循環體中,目前名稱將儲存在
name
變數中,並通過在名稱末尾mv
添加簡單地重命名文件。.inp
這並不能防止
mv
在可能存在名稱衝突的情況下覆蓋現有文件。為此,假設您使用 GNUmv
,您可能希望使用mv
它的--no-clobber
(or-n
) 選項,或者可能使用它的--backup
(or-b
) 選項。或者,您可以顯式檢查目標名稱是否存在,如果存在則跳過目前文件(如果您碰巧有一個與目標名稱同名的目錄,這也可以避免將文件移動到現有目錄中):
for name in [123][1-5]; do [ -e "$name.inp" ] || [ -L "$name.inp" ] && continue mv "$name" "$name.inp" done
將 GNU
mv
with--no-target-directory
(or ) 與or-T
結合使用將避免覆蓋現有文件(或使用 備份它們),並且還避免將文件移動到恰好與目標名稱具有相同名稱的子目錄中。-n``-b``-b