如何在Linux上使用rename命令

Linux筆記本電腦顯示bash提示Fatmawati Achmad Zaenuri / Shutterstock.com

掌握Linux世界的文件重命名強大並給予 MV– 和你自己 – 休息。 改名 靈活,快速,有時甚至更容易。這是一個命令強大的教程。

mv有什麼問題?

這沒什麼不對 MV 。該命令做得很好,它可以在所有Linux發行版,macOS和其他類Unix操作系統中找到。所以它總是可用的。但有時你只需要推土機,而不是鏟子。

MV 命令在生活中有目的,那就是移動文件。這是一個令人高興的副作用,它可用於將現有文件移動到具有新名稱的新文件中。凈效果是重命名文件,因此我們得到了我們想要的。但 MV 不是專用的文件重命名工具。

用mv重命名單個文件

使用 MV 重命名文件類型 MV,空格,文件名,空格以及您希望文件具有的新名稱。然後按Enter鍵。

您可以使用 LS 檢查文件是否已重命名。

mv oldfile.txt newfile.txt
ls * .txt

終端窗口中的mv oldfile.txt newfile.txt

用mv重命名多個文件

當您想要重命名多個文件時,事情會變得棘手。 MV 沒有能力處理重命名多個文件。你必須使用一些漂亮的Bash技巧。如果你知道一些中級命令行fu,那就沒問題了,但重命名多個文件的複雜性 MV 與易用性形成鮮明對比 MV 重命名單個文件。

事情迅速升級。

假設我們有一個目錄中包含各種不同類型的文件。其中一些文件具有“.prog”擴展名。我們想在命令行重命名它們,以便它們具有“.prg”擴展名。

我們如何爭吵 MV 為我們這樣做?我們來看看這些文件。

ls * .prog -l

ls * .prog -l在終端窗口中

這是一種不用編寫實際Bash腳本文件的方法。

for f in * .prog;做mv – “$ f”“$ f%.prog .prg”

for f in * .prog;在終端窗口中執行mv  - “$ f”“$ f%.prog .prg”

DId有用嗎?讓我們檢查文件,看看。

ls * .pr *

ls * .pr *在終端窗口中

所以,是的,它奏效了。它們現在都是“.prg”文件,目錄中沒有“.prog”文件。

剛剛發生了什麼?

這個長命令究竟做了什麼?讓我們分解吧。

for f in * .prog;做mv – “$ f”“$ f%.prog .prg”

第一部分啟動一個循環,依次處理目錄中的每個“.prog”文件。

下一部分說明了處理過程。它正在使用 MV 將每個文件移動到一個新文件。新文件將以原始文件的名稱命名,不包括“.prog”部分。將使用“.prg”的新擴展名。

必須有一個更簡單的方法

明確地。它是 改名 命令。

改名 不是標準Linux發行版的一部分,因此您需要安裝它。它在Linux的不同系列中也有不同的名稱,但它們都以相同的方式工作。您只需根據您正在使用的Linux風格替換相應的命令名稱。

在您安裝的Ubuntu和Debian派生的發行版中 改名 像這樣:

sudo apt-get install重命名

sudo apt-get install在終端窗口中重命名

在您安裝的Fedora和RedHat派生的發行版中 女士prename 像這樣。注意最初的“p”代表Perl。

sudo dnf安裝prename

sudo dnf在終端窗口中安裝prename

要在Manjaro Linux中安裝它,請使用以下命令。請注意,將調用重命名命令 Perl的重命名

sudo pacman -Syu perl-rename

sudo pacman -Syu perl-rename在終端窗口

讓我們再做一次

而這次我們將使用 改名。我們將回滾時鐘,以便我們有一組“.prog”文件。

ls * .prog

ls * .prog在終端窗口中

現在讓我們使用以下命令重命名它們。然後我們會檢查 LS 是否有效。記得替換 改名 如果您沒有使用Ubuntu或Debian派生的Linux,請使用適當的Linux命令名稱。

重命名's / .prog / .prg /'* .prog
ls * .pr *

在終端窗口中重命名's / .prog / .prg /'* .prog“width =”646“height =”147“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(這個);“onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

這工作,他們現在都是“.prg”文件,並且目錄中沒有“.prog”文件。

這個時間發生了什麼?

讓我們用三個部分解釋一下魔法。

第一部分是命令名稱, 改名 (要麼 女士prename 要麼 Perl的重命名 ,對於其他發行版)。

最後一部分是 * .prog,告訴 改名 操作所有“.prog”文件。

中間部分定義了我們想要對每個文件名進行的工作。該 小號 意味着替代。第一個任期(.prog) 是什麼 改名 將搜索每個文件名和第二個術語(.PRG)它將被取代。

命令的中間部分或中心表達式是一個Perl'正則表達式',它是給出的 改名 掌握其靈活性。

更改文件名的其他部分

到目前為止,我們已經更改了文件擴展名,讓我們修改文件名的其他部分。

在目錄中有很多C源代碼文件。所有文件名都以“slang_”為前綴。我們可以檢查一下 LS

ls sl * .c

ls sl * .c在終端窗口“width =”646“height =”212“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“onerror =”this。的onerror = NULL; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(本);

我們將用“sl_”替換所有出現的“slang_”。命令的格式對我們來說已經很熟悉了。我們只是更改搜索字詞,替換字詞和文件類型。

重命名's / slang_ / sl_'* .c

在終端窗口中重命名's / slang_ / sl_'* .c“width =”646“height =”77“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this); “onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

這次我們正在尋找“.c”文件,並搜索“slang_”。每當在文件名中找到“slang_”時,它將被替換為“sl_”。

我們可以通過重複檢查該命令的結果 LS 上面的命令使用相同的參數:

ls sl * .c

ls sl * .c在終端窗口“width =”646“height =”197“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);“onerror =”this。的onerror = NULL; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(本);

刪除部分文件名

我們可以通過替換搜索項來刪除文件名的一部分。

ls * .c
重命名's / sl _ //'* .c
ls * .c

在終端窗口中重命名's / sl _ //'* .c“width =”646“height =”352“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this); “onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

我們可以從中看到 LS 命令我們的“.c”文件都以“sl_”為前綴。讓我們完全擺脫它。

改名 命令遵循與以前相同的格式。我們將要尋找“.c”文件。搜索詞是“sl_”,但沒有替換詞。它們之間沒有任何東西的兩個反斜杠意味着什麼,一個空字符串。

改名 將依次處理每個“.c”文件。它將在文件名中搜索“sl_”。如果找到它,它將被替換為空。換句話說,刪除搜索詞。

第二次使用了 LS 命令確認已從每個“.c”文件中刪除“sl_”前綴。

限制對文件名特定部分的更改

我們來使用吧 LS 查看文件名中包含字符串“param”的文件。然後我們會用 改名 用字符串“parameter”替換該字符串。我們會用的 LS 再一次看到效果了 改名 命令對這些文件有影響。

ls * param *
重命名's / param /參數'* .c
ls * param *

在終端窗口中重命名's / param /參數'* .c“width =”646“height =”197“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this); “onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

發現四個文件在其文件名中有“param”。 param.c,param_one.c和param_two.c在其名稱的開頭都有“param”。 third_param.c在其名稱末尾有“param”,就在擴展名之前。

改名 命令將在文件名中的任何地方搜索“param”,並在所有情況下將其替換為“parameter”。

第二次使用了 LS 命令告訴我們,這正是發生的事情。無論“param”是在文件名的開頭還是末尾,它都被“參數”取代。

我們可以使用Perl的元字符來細化中間表達式的行為。元字符是表示字符位置或序列的符號。例如, ^ 意思是“字符串的開頭” $ 意思是“字符串的結尾”,和 表示任何單個字符(除了換行符)。

我們將使用字符串元字符的開頭( ^ )將我們的搜索限制在文件名的開頭。

ls * param * .c
重命名's / ^參數/值/'* .c
ls * param * .c
ls值* .c

在終端窗口中重命名's / ^參數/值/'* .c“width =”646“height =”247“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this );“onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

我們列出了之前重命名的文件,我們可以看到字符串“parameter”位於三個文件名的開頭,它位於其中一個文件名的末尾。

我們的 改名 命令使用行的開頭 (^)搜索詞“參數”之前的元字符。這告訴我 改名 如果它位於文件名的開頭,則僅考慮已找到的搜索詞。如果搜索字符串“參數”在文件名中的任何其他位置,則將忽略它。

檢查 LS,我們可以看到文件名末尾有“參數”的文件名沒有被修改,但是在名稱開頭有“參數”的三個文件名已經用替換術語“值”替換了搜索字符串“。

的力量 改名 在於Perl的力量。 Perl的所有功能都可供您使用。

使用分組搜索

改名 還有更多的伎倆。讓我們考慮一下你的名字中可能包含類似字符串的文件的情況。它們不是完全相同的字符串,因此簡單的搜索和替換在這裡不起作用。

在這個例子中我們使用 LS 檢查我們以“str”開頭的文件。它們有兩個,string.c和strangle.c。我們可以使用稱為分組的技術一次重命名兩個字符串。

這個的中心表達 改名 命令將搜索具有字符序列“stri”或“stra”的文件名中的字符串,其中這些序列後面緊跟“ng”。換句話說,我們的搜索詞將尋找“string”和“strang”。替換術語是“爆炸”。

ls str * .c
重命名's /(stri | stra)ng / bang /'* .c
ls ban * .c

在終端窗口中重命名's /(stri | stra)ng / bang /'* .c“width =”646“height =”197“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages .loadIfVisibleAndMaybeBeacon(this);“onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

運用 LS 第二次確認string.c已成為bang.c而strangle.c現在是bangle.c。

使用翻譯重命名

改名 命令可以對稱為翻譯的文件名執行操作。翻譯的一個簡單示例是將一組文件名強製為大寫。

在裡面 改名 以下命令通知我們沒有使用 S / 開始中心表達,我們正在使用 Y /。這說明 改名 我們沒有進行替換;我們正在進行翻譯。

A-Z term是Perl表達式,表示從a到z的序列中的所有小寫字符。同樣, A-Z term表示從A到Z的序列中的所有大寫字母。

此命令中的中心表達式可以解釋為“如果在文件名中找到從a到z的任何小寫字母,則用從A到Z的大寫字符序列中的相應字符替換它們。”

要強制所有“.prg”文件的文件名為大寫,請使用以下命令:

重命名'y / a-z / A-Z /'* .prg

ls * .PRG

在終端窗口中重命名'y / az / AZ /'* .prg“width =”646“height =”147“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this) ;“onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

LS 命令向我們顯示所有“.prg”文件名現在都是大寫的。事實上,要嚴格準確,它們不再是“.prg”文件。他們是“.PRG”文件。 Linux區分大小寫。

我們可以通過反轉該位置來反轉最後一個命令 A-ZA-Z 中心表達中的術語。

重命名'y / A-Z / a-z /'* .PRG

ls * .prg

在終端窗口中重命名'y / AZ / az /'* .PRG“width =”646“height =”147“src =”/ pagespeed_static / 1.JiBnMqyl6S.gif“onload =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this) ;“onerror =”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);

你(Wo | Do)不會在五分鐘內學習Perl

掌握Perl是值得的。但要開始使用的節省時間的功能 改名 命令,你不需要掌握很多Perl知識就可以獲得強大的功能,簡單性和時間上的巨大好處。

body #primary .entry-content ul#nextuplist list-style-type:none; margin-left:0px; padding-left:0px;
body #primary .entry-content ul#nextuplist li a text-decoration:none; color:#1d55a9;

請閱讀下一步

  • >您的華為或榮譽電話將會發生什麼?
  • >智能插頭會為自己付費嗎?
  • >硬件安全密鑰繼續召回;他們安全嗎?
  • > Google雲端硬盤和照片分裂:您需要了解的內容
  • >這就是為什麼iOS 13讓我想要一部iPhone
本文機器自動生成,不保證語句完整通順和表達準確,亦不對內容真實有效性負責,請讀者知悉。