Regular-Expression

使用正則表達式重命名文件

  • February 2, 2022

我在 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在可能存在名稱衝突的情況下覆蓋現有文件。為此,假設您使用 GNU mv,您可能希望使用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 mvwith --no-target-directory(or ) 與or-T結合使用將避免覆蓋現有文件(或使用 備份它們),並且還避免將文件移動到恰好與目標名稱具有相同名稱的子目錄中。-n``-b``-b

引用自:https://unix.stackexchange.com/questions/688845