重命名包含左/右方塊的目錄
要重命名包含左右方塊的目錄,您可以使用:
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(不是正則表達式)分配變數
path
、file
和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