Files

如何使用 rename 遞歸地將everyting重命名為大寫

  • September 14, 2021

我想遞歸地將所有文件和文件夾(子文件夾)重命名為大寫。

我發現了一些可以將其轉換為小寫的腳本,但我不知道如何更改它們,所以它會以相反的方式進行(從低到高)。

我找到並適用於小寫但我不知道如何修改的腳本是:

rename 'y/A-Z/a-z/' *

它來自man rename.

請注意,您使用的是由 Debian 及其衍生產品(Ubuntu、Mint 等)分發的Perl 腳本。rename其他 Linux 發行版提供了一個完全不同的、用處不大的命令,稱為rename.

y/A-Z/a-z/將範圍through中的每個字元轉換為範圍AthroughZ中的對應字元,即 ASCII 大寫字母到對應的小寫字母。要執行相反的翻譯,請使用. 編寫相同命令的另一種方法是— 是大寫函式,該命令根據對變數所做的轉換重命名文件。a``z``y/a-z/A-Z/``rename '$_ = uc($_)' *``uc``rename``$_

rename '…' *只重命名目前目錄中的文件,因為那是*匹配的。點文件(名稱以 開頭的文件.)也會被跳過。

如果要遞歸重命名目前目錄和子目錄中的文件,可以使用find命令遞歸遍歷目前目錄。這裡有一個困難:如果您呼叫rename,這將重命名目錄和基本名稱部分。如果您在遞歸rename到目錄之前呼叫目錄find -exec rename … {} \;(您可以通過在操作之前告訴遍歷目錄來find解決此問題,但是您最終會嘗試重命名為但該目錄不存在。find``foo/bar``FOO/BAR``FOO

避免這種困難的一種簡單方法是使重命名命令僅作用於路徑的基本名稱部分。正則表達式([^/]*\Z)匹配不包含/.

find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +

shell zsh提供了更方便的重命名功能——甚至比 Perl 更神秘,但更簡潔,而且通常更容易編寫。

該函式zmv根據模式重命名文件。執行autoload -U zmv一次以啟動它(將此行放入您的.zshrc.

zmv(要替換的模式)的第一個參數中,您可以使用 zsh 強大的萬用字元模式。在zmv(替換文本)的第二個參數中,您可以使用其參數擴展功能,包括歷史修飾符

zmv -w '**/*' '$1$2:u'

解釋:

  • -w— 自動為每個萬用字元模式分配數字變數
  • **/*— 子目錄中的所有文件,遞歸(**/匹配 0、1 或更多級別的子目錄)
  • $1— 第一個數字變數,這裡匹配每個路徑的目錄部分
  • $2:u— 第二個數字變數,這裡匹配每個路徑的基本名稱部分,帶有:u將值轉換為大寫的修飾符

作為額外的獎勵,這尊重環境區域設置。

如果您不確定zmv您編寫的命令,您可以傳遞-n選項以列印命令將執行的操作而不更改任何內容。檢查輸出,如果它符合您的要求,請重新執行命令而不-n實際操作。

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