
若要重新命名包含左右方塊的目錄,您可以使用:
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(不是正規表示式)分配變數 、 和 matchpath
時file
的修飾符。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