Shell-Script

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

  • August 18, 2020

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

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] 有人知道如何解決這個問題嗎?

似乎重命名功能無法處理起始目錄?

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

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

困難在於避免在遍歷目錄時重命名目錄。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(不是正則表達式)分配變數pathfile和match 時的修飾符。name單個修飾符 ( %, #, /) 表示最短或單個匹配;雙修飾符 ( %%, ##, //) 表示最長匹配或多個匹配。這一切都記錄在bash手冊頁中,但這是我對上下文的解釋:

  • ${item%/*}``%表示應從的值末尾刪除與 glob 模式的最短匹配項。因此,我們將刪除文本匹配離開$item``a/b/c``/*``a/b
  • ${item##*/}``##表示應該從的值的開頭刪除與 glob 模式的最長匹配。因此,我們將刪除文本匹配離開$item``a/b/c``*/``c
  • ${file//[[\]]/}``//表示應該將 glob的多個替換替換為 next 之後的文本/,即什麼都沒有。glob 是兩個字元[和的方括號集合],意思是“要麼[]”。所以ab[cd]ef[gh我們最終會得到abcdefgh

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