重新命名包含左/右方塊的目錄

重新命名包含左/右方塊的目錄

若要重新命名包含左右方塊的目錄,您可以使用:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

這將用 [ & ] 從您所在的目錄中遞歸重命名所有內容。

但我需要將其作為 nemo.action 腳本執行,但無法使其工作。 (基本上是一個普通的bash腳本)

我目前的腳本是:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

$@哪裡/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

哪裡的[ hdjue] [kskk] (只是隨機字母)是我要重新命名的起始資料夾以及以下檔案/資料夾...

這當然不起作用,現在我必須轉到父目錄並運行第一行,但這將處理父目錄中的所有目錄,不僅有人 [ hdjue] [kskk] 知道如何解決這個問題?

似乎重命名函數無法處理起始目錄?

如果可能,請刪除所有空格(替換為 .(點)),並使檔案名稱/目錄小寫,以簡化與外部/內部請求的兼容性。

答案1

據我了解,這裡的要求是從指定路徑及其下的檔案和目錄中刪除[和字元的所有實例。]

困難在於避免在仍在遍歷目錄時重新命名目錄。 globstar**從根向下列出項目,而不是深度優先,因此給定一個範例,例如a a/b a/b/c,重命名a將意味著a/b和的路徑a/b/c不再有效。這個find選項可以用它來處理這個問題-depth,但這需要不同的方法

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

echo當您滿意腳本將執行您期望的操作時,請刪除(或補充)它。

-print0我結合使用了-d ''選項來read處理具有非常奇怪的文件名的文件(包括帶有換行符和非打印字符的文件)。如果您想查看正在發生的情況,或者您的實作不支援它們,則可以刪除兩者,但腳本會變得不那麼健壯

使用 glob(不是正規表示式)分配變數 、 和 matchpathfile的修飾符。name單一修飾符 ( %, #, /) 表示最短或單一匹配;雙重修飾符 ( %%, ##, //) 表示最長匹配或多個匹配。這一切都記錄在bash手冊頁中,但這是我的解釋和上下文:

  • ${item%/*}%表明最短與 glob 模式的匹配應該從結尾的值$item。所以我們會刪除a/b/c匹配的文本/*a/b
  • ${item##*/}##表明最長與 glob 模式的匹配應該從開始的值$item。所以我們會刪除a/b/c匹配的文本*/c
  • ${file//[[\]]/}//表明多種的glob 的替換內容應替換為下一個後面的文本/,即什麼也不替換。 glob 是方括號中兩個字元[和的集合],意思是「或[]。所以ab[cd]ef[gh我們最終會得到abcdefgh

相關內容